Rubyで文字列の式展開を後から行うには?
例えば、なんらかの名前を受け取り、その名前に対して挨拶するようなクラスとして、以下のようなものを定義したとします。
class SimpleGreeting
def initialize name
@name = name
end
def say
"Hello, #{@name}"
end
end
このとき、say
の内部にある文字列を変えることができれば、もっと柔軟な挨拶ができるのではないか、と思いました。しかし、最初に文字列を渡して、あとから式展開を行うスマートな方法がわかりません。それに近い挙動は再現できたのですが、とてもスマートとはいえない気がします。
class Greeting
def initialize name, template
@name = name
@template = "\"#{template}\""
end
def say
eval <<-EOF
name = '#{@name}'
#{@template}
EOF
end
end
このようなクラスを定義してあげれば、確かに下のように利用することは可能です。
puts Greeting.new('esehara', 'Hello, #{name}').say
#output: Hello, esehara
puts Greeting.new('esehara', 'こんにちは, #{name}').say
#output: こんにちは, esehara
とはいえ、このような挙動を、もっと簡単に実現する方法がありそうな気がしましたが、どうでしょうか。それとも、このような文字列の使い方そのものが余りスマートではないと考えるべきなのでしょうか?