Ruby 1.9 の String#% で名前付き指示子(?)を使う
名前付き指示子と言って良いのかわかりませんが、以下の様なものです。
(001): >> RUBY_VERSION => "1.9.2" (002): >> '%{name}' % { :name => 'replaced' } => "replaced"
今日まで String#% でこんな事が出来る事を知りませんでしたが、i18n gem の I18n.translate 経由で知りました。
I18n.translate は Hash でパラメータを渡すことで変数展開ができますが、その処理を String#% で実現している様です。
余談ですが、Hash のキーはシンボルでなければなりません。
(003): >> '%{name}' % { 'name' => 'replaced' } KeyError: key{name} not found from (irb):3:in `%' from (irb):3 from /usr/local/bin/irb:12:in `<main>'
先述の通り、I18n.translate は String#% を使っているので、同様の制約があるので注意が必要です。知りませんでした…。
ちなみに、Ruby 1.8.7 では使えないようです。
(001): >> RUBY_VERSION => "1.8.7" (002): >> '%{name}' % { :name => 'replaced' } ArgumentError: malformed format string - %{ from (irb):2:in `%' from (irb):2 (003): >> '%{name}' % { 'name' => 'replaced' } ArgumentError: malformed format string - %{ from (irb):3:in `%' from (irb):3
どのドキュメントを読めば詳しい情報が得られるのかわからず、この程度の理解に留まっています。