Techioz Blog

Rubyのハッシュを使用した文字列補間

概要

私の目的は、文字列内のキーをハッシュ内の値に置き換えることです。私は次のようにやっています:

"hello %{name}, today is %{day}" % {name: "Tim", day: "Monday"}

文字列内のキーがハッシュにない場合:

"hello %{name}, today is %{day}" % {name: "Tim", city: "Lahore"}

その場合、エラーがスローされます。

KeyError: key{day} not found

期待される結果は次のようになります。

"hello Tim, today is %{day}" or "hello Tim, today is "

エラーをスローせずに一致するキーのみを置き換える方向に誰かが私をガイドしてもらえますか?

解決策

Ruby 2.3 以降、% は、default=: で設定されたデフォルト値を尊重します。

hash = {name: 'Tim', city: 'Lahore'}
hash.default = ''

'hello %{name}, today is %{day}' % hash
#=> "hello Tim, today is "

または、default_proc=: によって設定された動的なデフォルト

hash = {name: 'Tim', city: 'Lahore'}
hash.default_proc = proc { |h, k| "%{#{k}}" }

'hello %{name}, today is %{day}' % hash
#=> "hello Tim, today is %{day}"

欠落しているキー、つまり :day のみが proc に渡されることに注意してください。したがって、フォーマット文字列で %{day} を使用するか %s を使用するかは認識されず、異なる出力が生じる可能性があります。

'hello %{name}, today is %<day>s' % hash
#=> "hello Tim, today is %{day}"