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} を使用するか %
'hello %{name}, today is %<day>s' % hash
#=> "hello Tim, today is %{day}"