概要
この記事では、<<
演算子を使用した文字列の連結方法について詳しく見ていきます。
文字列連結方法
Rubyでは文字列の連結にいくつかの方法があります、一般的なのが +
演算子、
次に今回の記事のお題にもなっている <<
演算子。
+
演算子:
「str1 + str2」 という形式で使用される。
str1 と str2 を連結した新しい文字列を作成します。
この操作では、元の文字列は変更されず、新しい文字列オブジェクトが毎回生成されます。
<<
演算子:
「str1 << str2」 という形式で使用される。
str2 の内容を str1 に直接追加します。
この操作は str1 を破壊的に変更し、新しいオブジェクトの生成を伴わないため、メモリ効率が良く、処理速度も速いです。
<< 演算子の利点
大量の文字列データを扱う際に特に有効で、大きなファイルの内容を読み込んで処理を行いたい場合、 +
よりも <<
演算子を使う方がパフォーマンスが良いです。
理由として、<<
演算子は元の文字列に直接追加するため、途中に不要な文字列のオブジェクトが生成されないからです。
使用例
sentence = ""
words = ["hello", "world", "from", "ruby"]
words.each do |word|
sentence << word << " "
end
puts sentence
# => "hello world from ruby "
コメントアウトを追加したバーション※上のコードと全く同じです。
コードの各部分が何をしているのか明確に理解するため。
# 空の文字列を初期化する。これが最終的に全ての単語を含む文になる。
sentence = ""
# 単語の配列を定義する。
words = ["hello", "world", "from", "ruby"]
# each文で配列`words`の各要素`word`に対して繰り返し処理を行う。
words.each do |word|
# ①sentenceに最初の `hello` 追加。
# ②`" "` でスペースを1つ追加 ➡ これにより単語と単語の間にスペース挿入。
# ③2が終了した時点で `sentence` には `hello` とスペースが代入されている
# ④次は二つ目の `world` を同じように `sentence` に追加していく
sentence << word << " "
end
# ループが完了した後、`sentence` には全ての単語がスペースで区切られて連結されている。
# 全て連結した文を出力する。
puts sentence
# => "hello world from ruby "
補足説明
①sentence
で文字列の初期化、これにより最後に文字列を連結するための空の基盤が用意されるのと、プラス後の文字列を代入するためとしても機能する。
②each
文で配列の繰り返し処理、配列 words
の各要素 |word|
を順に取り出していく
③文字列連結、sentence << word << " "
は、
現在の単語 word
とスペース " "
を sentence
に連続して追加。
centence
の内容を直接変更 ➡ 破壊的操作
④文字列の出力, puts sentence
で完成した長文を出力
まとめ
大量のデータを扱う際や、アプリケーションの効率化を図る際は、メモリとパフォーマンスの観点から <<
演算子を使用した方が良さそうです。