Rubyでプログラミングを行う上で、文字列の連結は避けて通れない基本的な操作です。
「名前」と「敬称」をくっつけたり、データベースから取得した値をメッセージに埋め込んだりと、あらゆる場面で利用されます。
単に + でつなぐだけでなく、式展開や << 演算子を適切に使い分けることで、コードの可読性を高めたり、処理速度を向上させたりすることができます。
この記事では、Rubyにおける文字列連結の基本から、現場で推奨されるベストプラクティス、さらにはパフォーマンスを意識した高速化テクニックまでをわかりやすく徹底解説します。
![]() 執筆者:マヒロ |
|
Rubyで文字列を連結する4つの基本メソッド
Rubyで文字列をくっつける方法は主に4つあります。
それぞれに特徴があり、用途に応じて使い分けることが重要です。
まずは代表的な手法を一つずつ見ていきましょう。
1. プラス演算子(+)を使う【簡単】
最も直感的で、多くのプログラミング言語で採用されているのがプラス演算子 + を使う方法です。
2つの文字列を足し算のように結合し、新しい文字列を作成します。
str1 = "Hello, "
str2 = "Ruby!"
# + 演算子で連結
result = str1 + str2
puts result
# 出力結果: Hello, Ruby!
この方法はシンプルで分かりやすいですが、連結するたびに新しい文字列オブジェクト(インスタンス)を生成するという内部的な特徴があります。
そのため、巨大なループの中で何万回も + で連結を繰り返すと、メモリを消費し、処理速度が低下する原因になることがあります。
2. 式展開(#{variable})を使う【推奨】
Rubyにおいて、変数を文字列の中に埋め込む際に最も推奨されるのが「式展開(String Interpolation)」です。
ダブルクォート " で囲んだ文字列の中で #{変数名} と記述すると、その変数の値が文字列として展開されます。
name = "Alice"
age = 25
# 式展開を使って連結
message = "My name is #{name}, and I am #{age} years old."
puts message
# 出力結果: My name is Alice, and I am 25 years old.
式展開の最大のメリットは、可読性が高いことです。
+ を何度も使ってクォートを開閉する必要がなく、文章の流れをそのまま記述できます。
また、#{} の中身が数値(Integer)などであっても、自動的に to_s メソッドが呼ばれて文字列に変換されるため、型変換のエラーを気にする必要がありません。
3. concatメソッドまたは<<演算子を使う【高速】
既存の文字列オブジェクトの末尾に、別の文字列を直接付け加える方法です。
concat メソッド、またはそのエイリアスである <<(ショベル演算子)を使用します。
greeting = "Good "
greeting << "Morning"
puts greeting
# 出力結果: Good Morning
# 元の変数が変更されている点に注意
puts greeting.object_id
# 連結前後でオブジェクトIDは変わりません(同じオブジェクトを使い回している)
この方法は「破壊的メソッド」と呼ばれ、元の文字列自体を変更します。
新しいオブジェクトを生成しないため、メモリ効率が良く、処理速度も + 演算子より高速です。
ログの生成や、大量のテキスト処理を行うループ内など、パフォーマンスが重視される場面で好んで使われます。
4. 配列を結合するjoinメソッド
複数の文字列が配列(Array)に入っている場合、それらをまとめて一つの文字列にしたいときは join メソッドが便利です。
words = ["Ruby", "is", "fun"]
# 引数なしだとそのまま連結
puts words.join
# 出力結果: Rubyisfun
# 引数に区切り文字を指定できる
puts words.join(" ")
# 出力結果: Ruby is fun
puts words.join(" / ")
# 出力結果: Ruby / is / fun
CSVデータの作成(カンマ区切り)や、URLのパス結合などで頻繁に利用されます。
初心者がハマりやすい「TypeError」とその対処法
文字列連結を行っていると、頻繁に遭遇するのが TypeError です。
特に + 演算子を使っている場合、文字列以外の型(数値など)を直接足そうとするとエラーになります。
数値を + で連結しようとするとエラーになる
Rubyは型に厳格な言語であるため、文字列(String)と数値(Integer)を直接足し算することはできません。
price = 100
# 以下はエラーになります
# puts "Price: " + price
# => TypeError: no implicit conversion of Integer into String
対処法1:to_s メソッドで文字列に変換する
最も基本的な解決策は、数値に対して to_s メソッドを呼び出し、明示的に文字列へ変換することです。
price = 100
puts "Price: " + price.to_s
# 出力結果: Price: 100
対処法2:式展開を利用する(スマートな方法)
前述の通り、式展開 #{} を使用すれば、内部で勝手に to_s が行われます。
コードもスッキリするため、基本的にはこちらを使うのがベターです。
price = 100
puts "Price: #{price}"
# 出力結果: Price: 100
パフォーマンス比較!高速な連結方法はどれ?
実務で大量のデータを扱う際、どの連結方法を選ぶかで処理時間が大きく変わる可能性があります。
ここでは、それぞれのメソッドのパフォーマンス特性について解説します。
「破壊的変更」が速度のカギ
結論から言うと、最も高速なのは <<(ショベル演算子)や concat を使った破壊的な連結です。
これは、メモリ上で新しい領域を確保せずに、既存の領域にデータを書き足していくためです。
一方、+ 演算子は連結のたびに新しい文字列オブジェクトを作成してメモリを確保し直すため、ループ回数が増えるとオーバーヘッドが大きくなります。
ベンチマークのイメージ
10万回の連結ループを行った場合、一般的に以下のような速度順になります(環境により異なります)。
- 最速:
buffer << "text"(破壊的連結) - 普通:
"text #{variable}"(式展開) - 遅い:
string = string + "text"(+演算子による再代入)
ただし、数回程度の連結であれば、人間の体感できる差はありません。
可読性を優先し、通常は「式展開」を使い、パフォーマンスが必要な局所的なループ内でのみ << を使うという使い分けが現実的です。
Ruby 3.x時代における注意点(frozen_string_literal)
近年のRuby開発(Rails含む)では、ファイルの冒頭にマジックコメント # frozen_string_literal: true を記述することが増えています。
これは、そのファイル内で定義される文字列リテラルをすべて「凍結(変更不可)」にする設定です。
この設定が有効な場合、文字列を直接変更しようとするとエラーになります。
# frozen_string_literal: true
str = "Hello"
# 以下の行はエラーになります(can't modify frozen String)
# str << ", World"
# 対処法:新しい文字列を作る += ならOK
str += ", World"
puts str
# 出力結果: Hello, World
frozen_string_literal: true の環境下では、不変(Immutable)なオブジェクトとして扱うことが基本となるため、破壊的な << ではなく、+ や +=、あるいは式展開を使う頻度が高まります。
パフォーマンスチューニングのために << を使いたい場合は、String.new で可変な文字列オブジェクトを生成してから操作するなどの工夫が必要です。
Rubyのスキルを活かして年収を上げる方法
以上、Rubyで文字列を連結する方法について解説してきました。
なお、Rubyのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなRubyの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



