【Ruby】文字列結合には「#{}」を使うべき、という話

Categories:Ruby

ここではrubyにおける「文字列として結合」するメソッドのうち、#{}を使うと無難だよということを説明していきます。

 rubyの「文字列として結合」

rubyでは、文字列を連結するメソッドとして#+#{}という2つのメソッドが用意されています。通常文字列どうしの結合では、この2つのメソッドは同じ結果を得ます。

str_a = "world."

str_b = "Hello, " + str_a + " How are you?"
str_c = "Hello, #{str_a} How are you?"

puts str_b # -> Hello, world. How are you?
puts str_c # -> Hello, world. How are you?

ここでカンの良い人は気づいたかもしれませんが、上のコードのstr_b, str_cが同じ結果を出力するのは、「文字列どうしの結合だから」です。つまり、実装時のミスなどで「数値+文字列の結合」という形になった場合などでは、得られる結果が異なってきます。

str_a = 100
str_b = "100 * " + str_a + " = 10000"
# -> `+': no implicit conversion of Integer into String (TypeError)

puts str_b

上のコード例に見られるように、#+の場合はTypeErrorが発生して処理が正常に終了しません。

これに対して、#{}(「式展開 interpolation」と呼ばれます)ではメソッド内部で文字列でない値に対してto_sして文字列にしてから結合処理するため、上のようなエラーが発生しません(#{}は値がnilの時も空文字""として出力します)。

また、to_sはObjectクラスにあるため、「すべてがObject」の世界であるrubyではほとんどのオブジェクトでエラーなく実行することが可能です。

※「ほとんどの」と書いたのは、rubyではObject < Kernel < BasicObjectという継承関係があるので、Objectクラスより上位のKernel, BasicObjectにおいてはエラーになります。

以上のような理由から、「文字列としての結合」には#{}メソッドを利用する方が無難です(書き方が私の好みでもあります)。

 参考

返信がありません

コメントを残す

メールアドレスが公開されることはありません。