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

どのドキュメントを読めば詳しい情報が得られるのかわからず、この程度の理解に留まっています。