Rubyでプログラミングを行う際、複数の文字列を一つに繋ぎ合わせる「文字列連結」は、日常的に発生する基本的な操作です。
ユーザーへのメッセージを生成したり、ファイルパスを組み立てたりと、その用途は多岐にわたります。
Rubyには、この文字列連結を実現するための方法がいくつか用意されています。
しかし、それぞれに挙動やパフォーマンスの特性が異なり、「どの方法を使うのがベストなの?」「+
と<<
はどう違うの?」と疑問に思う方も少なくありません。
特に、元の文字列を変更してしまう「破壊的なメソッド」と、新しい文字列を生成する「非破壊的なメソッド」の違いを理解することは、意図しないバグを避ける上で非常に重要です。
この記事では、最新のRubyの仕様に基づき、文字列を連結するための主要な方法を比較し、それぞれの正しい使い方と適切な選び方を、豊富なサンプルコードと共に徹底的に解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
【結論】目的別!文字列連結の方法 早見表
まず最初に、この記事で解説する主要な文字列連結方法を、目的別にまとめた早見表(チートシート)で示します。
時間がない方は、まずはこちらで目的に合った方法を確認してください。
方法 | 構文例 | 特徴 | おすすめのケース |
---|---|---|---|
式展開 | "#{str1} #{str2}" |
最も推奨。変数の内容を文字列に埋め込む。可読性が非常に高い。非破壊的。 | 変数と文字列リテラルを組み合わせるほとんどの場面。 |
+ 演算子 |
str1 + str2 |
直感的で分かりやすい。新しい文字列オブジェクトを生成する(非破壊的)。 | 単純に2つの文字列変数を連結する場合。 |
<< / concat |
str1 << str2 |
元の文字列を直接変更する(破壊的)。パフォーマンスが良い。 | ループ内で大量の文字列を連結する場合など、速度が求められる場面。 |
* 演算子 |
str * 3 |
同じ文字列を指定回数繰り返して連結する。 | 特定の文字列パターンを生成する場合。 |
Array#join |
[str1, str2].join |
配列の要素を一つの文字列に連結する。 | 配列に格納された複数の文字列を効率的に連結したい場合。 |
方法1:式展開 #{}(最も推奨)
変数と文字列リテラル(コード内に直接記述された文字列)を組み合わせて新しい文字列を作る場合、式展開(String Interpolation)が最も推奨される、Rubyらしい書き方です。
ダブルクォート("
)で囲まれた文字列の中で、#{}
という記号の中に変数や式を記述すると、その部分が評価された結果の文字列に置き換えられます。
サンプルコード
name = '山田'
age = 30
# 式展開を使って文字列を組み立てる
greeting = "#{name}さんの年齢は#{age}歳です。"
puts greeting
実行結果
山田さんの年齢は30歳です。
コードの解説
#{name}
の部分が変数name
の値である'山田'
に、#{age}
の部分が変数age
の値である30
に置き換えられています。
この方法は、最終的にどのような文字列が生成されるのかが一目瞭然で、非常に可読性が高いのが最大のメリットです。
+
演算子を多用するよりも、はるかにコードがすっきりとします。
方法2:+ 演算子(非破壊的)
+
演算子は、多くのプログラミング言語で使われる、最も直感的で分かりやすい文字列連結の方法です。
2つの文字列を繋ぎ合わせ、新しい一つの文字列オブジェクトを生成します。
元の文字列自体は変更されないため、「非破壊的」なメソッドと呼ばれます。
サンプルコード
first_name = 'Taro'
last_name = 'Suzuki'
# + 演算子で連結
full_name = first_name + ' ' + last_name
puts full_name
puts "元の変数 first_name は変更されていません: #{first_name}"
実行結果
Taro Suzuki
元の変数 first_name は変更されていません: Taro
コードの解説
first_name
と' '
(半角スペース)、last_name
が連結されて、新しい文字列"Taro Suzuki"
が生成され、変数full_name
に代入されました。
重要なのは、+
を使っても元の変数first_name
の中身は変わらないという点です。
方法3:<< 演算子 / concat メソッド(破壊的)
<<
(ショベル演算子)やconcat
メソッドは、+
演算子とは全く異なる挙動をします。
これらのメソッドは、新しい文字列を生成するのではなく、メソッドを呼び出した元の文字列の末尾に、引数で渡された文字列を追加します。
つまり、元の文字列を直接変更する「破壊的なメソッド」です。
サンプルコード
greeting = 'こんにちは'
name = '佐藤さん'
# << 演算子で、greeting変数自体を変更する
greeting << '、'
greeting << name
puts greeting
puts "concatメソッドも同じ挙動です。"
message = 'おはよう'
message.concat('、')
message.concat('田中さん')
puts message
実行結果
こんにちは、佐藤さん
concatメソッドも同じ挙動です。
おはよう、田中さん
コードの解説
greeting << '、'
が実行された時点で、変数greeting
の中身が'こんにちは'
から'こんにちは、'
に書き換えられています。
このように、元の変数の状態が変化してしまうため、意図しないバグの原因になる可能性があり、使用には注意が必要です。
一方で、新しいオブジェクトを生成しないため、ループ処理の中で大量の文字列を連結していくような場面では、+
演算子よりも高速に動作するというメリットがあります。
方法4:* 演算子(文字列の繰り返し)
*
演算子を文字列に対して使うと、その文字列を指定された回数だけ繰り返した新しい文字列を生成します。
サンプルコード
border = '-' * 20
puts border
puts "テキスト"
puts border
実行結果
--------------------
テキスト
--------------------
区切り線や、テストデータを作成する際などに便利です。
方法5:Array#join(配列要素の連結)
複数の文字列が配列に格納されている場合、それらを一つの文字列に連結するにはjoin
メソッドを使うのが最適です。
join
メソッドは、配列の各要素を文字列に変換し、引数で指定した区切り文字で繋ぎ合わせます。
サンプルコード
tags = ['Ruby', 'プログラミング', '入門']
# カンマとスペースを区切り文字として連結
tags_string = tags.join(', ')
puts tags_string
# 区切り文字を省略すると、要素がそのまま連結される
path_parts = ['home', 'user', 'documents']
path = path_parts.join('/')
puts path
実行結果
Ruby, プログラミング, 入門
home/user/documents
for
ループなどを使って+
や<<
で連結していくよりも、はるかに簡潔で効率的に処理できます。
パフォーマンスと使い分けの指針
各連結方法には、パフォーマンスの面で違いがあります。
+
: 連結のたびに新しい文字列オブジェクトを生成するため、ループ内で何度も実行するとメモリ効率が悪く、遅くなる傾向があります。<<
/concat
: 既存のオブジェクトを変更するだけなので、ループ内での大量連結では最も高速です。#{}
(式展開): 内部的には+
に近い挙動をしますが、多くの場合で最適化されており、可読性の高さを考えると最もバランスの取れた選択肢です。
これらの特性を踏まえ、以下のような使い分けを推奨します。
- 基本は「式展開 (
#{}
)」を使う: 変数と文字列を組み合わせるなら、まず式展開を検討してください。コードが最も読みやすくなります。 - 配列は「
join
」を使う: 配列に格納された文字列を連結する場合は、join
が最も効率的でRubyらしい書き方です。 - パフォーマンスが最優先されるループでは「
<<
」を検討する: ログの生成など、何万回もループするようなパフォーマンスが非常に重要な場面に限っては、破壊的であることを理解した上で<<
の使用を検討する価値があります。
まとめ
今回は、Rubyで文字列を連結するための主要な方法について、それぞれの特徴と正しい使い分けを解説しました。
なお、Rubyを体系的に学んだり、Rubyのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。
特にRuby+Railsを学ぶ場合は、群を抜いて評判の良い「RUNTEQ」を強くおすすめします。