概要
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」と表示されます
h
は Hoge
クラスのインスタンスですがちゃんと式展開されたときに 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 件のコメント:
コメントを投稿