突然ですが、Rubyで文字列を連結させる方法をご存知ですか?
文字列の連結は、プログラミングする上で基本中の基本となる処理です。Rubyにおいて、文字列を連結させる方法はいくつか存在し、それぞれ動作にどのような違いがあるのかを理解することが、バグを生まないための重要なポイントとなります。
今回は、Rubyで文字列を連結する方法をサンプルコードを交えて詳しく解説します。文字列の連結処理を理解したい方は、ぜひ参考にしてください。
なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。
みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]
フリーランス案件を探すならこのエージェント!
転職を考えているならこのエージェント!
「+」メソッド
最初に紹介するのは、最も基本的な文字列連結である+メソッドです。足し算で利用されることもある記号ですが、文字列型に対しては文字列の連結処理として作用します。以下のサンプルコードで、動作を詳しく確認しましょう。
sample_srting_1 = "Hello world!"
sample_srting_2 = "I'm a Ruby programmer."
sample_srting_3 = "Programming is very interesting."
# 上記3つの文字列を+で連結
sentence = sample_srting_1 + " " + sample_srting_2 + " " + sample_srting_3
# 連結対象文字列:連結処理による影響を受けない
p sample_srting_1 # "Hello world!"
p sample_srting_2 # "I'm a Ruby programmer."
p sample_srting_3 # "Programming is very interesting."
# 連結後文字列
p sentence # "Hello world! I'm a Ruby programmer. Programming is very interesting."
あらかじめ定義された3つの文字列を、+メソッドで連結し、新たな文字列を作成するプログラムを実装しています。連結処理の元となる文字列は連結処理による影響を受けません。
+メソッドは、文字列型のデータのみを受け付けています。文字列型以外のデータを連結させたい場合は、to_sメソッドで文字列型のデータへ変換する必要があります。to_sメソッドは、Objectクラスで実装されているメソッドなので、Rubyにおけるすべてのオブジェクトに対応しています。サンプルコードは、以下の通りです。
# 文字列以外のデータはto_sメソッドで文字列型に変換後に連結
p "abcdefg" + 123.to_s + true.to_s + [11, 22, 33].to_s # "abcdefg123true[11, 22, 33]"
「<<」メソッド
次に紹介するのは、<<メソッドです。<<メソッドは+メソッドと違い、ある文字列に別の文字列を追加する形で文字列を連結させるのが特徴的です。したがって、連結処理によって連結処理の素となる文字列が更新されます。以下のサンプルコードで、+メソッドとの違いにも意識しながら動作確認してみましょう。
sample_string = "今日の天気は大雨です。"
add_string_1 = "したがって、試合は延期します。"
add_string_2 = "新たな試合日は追って連絡します。"
# <<メソッドで右側の文字列を、左側の文字列の末尾に追加
result = sample_string << add_string_1
# <<メソッドの戻り値は連結後の文字列
p result # "今日の天気は大雨です。したがって、試合は延期します。"
# 一方、元の文字列が連結後のものに更新されている
p sample_string # "今日の天気は大雨です。したがって、試合は延期します。"
# したがって新しく変数を用意する必要がない
sample_string << add_string_2
p sample_string # "今日の天気は大雨です。したがって、試合は延期します。新たな試合日は追って連絡します。"
<<メソッドの戻り値が、連結後の文字列である一方で、連結対象の文字列のうち記号「<<」の左側の文字列も、連結処理によって更新されていることが分かります。この点が、+メソッドとは大きく異なります。
新しく変数を確保する必要がない場合は、+メソッドよりも<<メソッドを使うのが最適です。
なお、<<メソッドと全く同様の機能を持つメソッドとして、concat()メソッドがあります。文字列の連結処理以外に、配列と配列の連結処理としても機能するため、両者を混同しないように注意しましょう。サンプルコードは、以下の通りです。
sample_string = "今日の天気は雨です。"
sample_string.concat("雨が止んだ場合は試合を決行します。")
p sample_string # "今日の天気は雨です。雨が止んだ場合は試合を決行します。"
# 配列と混同しないように注意
sample_string.concat(["1", "2", "3"]) # no implicit conversion of Array into String (TypeError)
join()メソッド
次に紹介するのは、join()メソッドです。join()メソッドは、Arrayクラスで実装されているメソッドで、配列に格納されている文字列を連結する機能を持ちます。
+メソッドや<<メソッドが、文字列型のデータを素にしているのに対し、join()メソッドは文字列が格納された配列を素にしているのが大きな特徴です。
以下のサンプルコードで、動作を詳しく確認しましょう。
# 文字列が格納された配列を用意
sample_str_array = ["AAA", "BBB", "CCC", "DDD"]
# join()メソッドで各要素を連結
result = sample_str_array.join
p result # "AAABBBCCCDDD"
join()メソッドは、配列をレシーバとするのが前提であるため、文字列が配列に格納されている必要があります。join()メソッドによって連結処理が実行されると、各要素が一つの文字列として連結されることが分かります。
区切り文字を追加する
join()メソッドは、連結する際に区切り文字を要素ごとに挿入することが可能です。
例えば、スラッシュ「/」で文字列を区切りたい場合は、join()メソッドの引数に「/」を設定します。区切り文字付きで文字列を連結する処理のサンプルコードは、以下の通りです。
sample_item = ["名刺", "カバン", "ネクタイ", "マスク"]
# join()メソッドの引数に区切り文字を設定
result = sample_item.join("/")
p result # "名刺/カバン/ネクタイ/マスク"
配列が入れ子になっている場合
配列の要素が配列の場合は、すべての配列を展開する形で文字列連結処理が実行されます。
ただし、再帰的に入れ子になっている場合は、エラーとなるので注意してください。以下のサンプルコードで、入れ子になっている場合の挙動を確認しましょう。
# 入れ子の配列
nest_data = ["1", "2", ["A", "B", ["a", "b"]]]
# 入れ子の配列はすべて展開した上で連結する
p nest_data.join # "12ABab"
# ただし再帰的に入れ子になっている場合はエラーとなるため注意
recursive_array = ["recursive", "array"]
recursive_array.push(recursive_array)
p recursive_array.join # recursive array join (ArgumentError)
p “この行は実行されません。”
変数nest_dataは、3段の入れ子構造を成している配列です。
変数nest_dataに対してjoin()メソッドを呼び出すと、入れ子の部分も含めてすべて文字列連結され、最終的に1つの文字列「12ABab」が出力されます。
一方、9行目のように再帰的に定義された配列の場合は、join()メソッドを実行すると、エラーとなってプログラムが中断することが分かります。
式展開
最後に紹介するのは、式展開です。式展開はメソッドではなくRubyの記法の1つで、ダブルクオーテーションで囲んだ文字列リテラルに式を埋め込むことができます。この記法を利用することで、文字列を連結させることができます。式展開のサンプルコードを、以下に示します。
word = "Ruby"
# #{} の中に変数を直接記述するだけで文字列連結可能
p "#{word} is very interesting." # "Ruby is very interesting."
prices = [120, 240, 500, 1100]
# 文字列以外のデータを挿入した場合は、to_sメソッドによって文字列に変換される
p "合計は#{prices.inject(:+)}円です。" # "合計は1960円です。"
式展開は、ダブルクオーテーションで囲んだ文字列の中に、「#{}」を埋め込むことで実装可能です。
変数の他、式を代入したりメソッドを呼び出したりすることもでき、文字列以外のデータであれば、文字列として表現されたものを自動で生成したうえで、連結処理を施します。
さまざまな種類のデータに関して文字列連結したいのであれば、+メソッドや<<メソッドを使うよりも、式展開を利用することで、to_sメソッドを使った型変換処理をわざわざ実装しなくて済みます。
文字列連結処理のまとめ
最後に、Rubyにおける文字列連結処理の特徴を表にまとめました。それぞれの違いを意識しつつ、文字列の連結処理を実装できるようにしましょう。
方法 | 特徴 |
---|---|
+メソッド | ・連結後の文字列を新たなデータとして作成 ・文字列以外のデータは別途変換処理が必要 |
<<メソッド(concat) | ・連結後の文字列でレシーバの文字列を更新 |
join()メソッド | ・レシーバは文字列を要素として含む配列 ・連結時に区切り文字を挿入可能 ・入れ子構造の配列はすべて展開したうえで連結 ・再帰的な入れ子構造の配列は実行不可 |
式展開 | ・文字列リテラル内に式を埋め込むことで連結 ・文字列以外のデータは自動的に文字列表現に変換 |
お仕事の途中ですが、少し一休みして、転職や独立について考えてみませんか🙌?
現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】
レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】
MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】
日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲
最後に
さて、ここまでRubyを使って文字列を連結する方法について解説してきましたがいかがでしたか?
「文字列の連結」と一口に言ってもその方法は様々です。その場面場面によって使い分ける必要がありますので、今回ご紹介した方法は全て理解しておいてくださいね。
これらをマスターしておけば、開発効率もグンと上がること間違いなしです。
このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。
最後まで読んで頂きありがとうございました。