2019年4月24日水曜日

Ruby の式展開は to_s メソッドが呼ばれている

概要

Ruby ではダブルクォートで囲った文字列リテラル内で #{} を使って式を囲むとその式が評価された結果で展開されます
普通は文字列変数などを展開するのに使います

内部ではそのインスタンスが持つ to_s メソッドがコールされているようでこれを利用すれば文字列リテラル以外にも自分で作成したクラスのインスタンスを式展開することができます

環境

  • macOS 10.14.4
  • Ruby 2.6.2p47

とりあえずサンプルコード

  • vim app.rb
class Hoge
  def to_s
    "hoge"
  end
end

h = Hoge.new
puts "#{h}"
  • ruby app.rb

これで実行すると「hoge」と表示されます
hHoge クラスのインスタンスですがちゃんと式展開されたときに to_s がコールされその返り値の値が表示されています

to_s がない場合

class Hoge
end

h = Hoge.new
puts "#{h}"

この場合は p と同じ結果が得られます

#<Hoge:0x00007f84a2857d88>

また to_s が最終的に文字列を返さない場合も p が呼ばれたときと同じような表示なります
なので数字を返す場合はそこで to_s してあげましょう

class Hoge
  def to_s
    1.to_s
  end
end

「式」なので if 文も書ける

こんな感じにすると true の場合だけ特定の文字列を表示することもできる

puts "#{"hoge" if true}"

こんな感じにも書ける

puts "#{if false then "not print this" else "print this" end}"

たださすがにこうなると読みにくいので素直にメソッドにしたほうがいいと思います

0 件のコメント:

コメントを投稿