例えば、なんらかの名前を受け取り、その名前に対して挨拶するようなクラスとして、以下のようなものを定義したとします。

 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

とはいえ、このような挙動を、もっと簡単に実現する方法がありそうな気がしましたが、どうでしょうか。それとも、このような文字列の使い方そのものが余りスマートではないと考えるべきなのでしょうか?