ruby 中带哈希的字符串插值

String interpolation with hash in 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}%<day>s,这可能会导致不同的输出:

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

您可以设置默认哈希值:

h = {name: "Tim", city: "Lahore"}
h.default = "No key"
p "hello %{name}, today is %{day}" % h #=>"hello Tim, today is No key"

我有带空格的哈希键,在将键转换为符号后它起作用了。

带字符串键的哈希(它在插值时返回错误):

hash = {"First Name" => "Allama", "Last Name" => "Iqbal"}

将散列键转换为符号对我有用:

hash = {:"First Name" => "Allama", :"Last Name" => "Iqbal"}
hash.default = ''

'The %{First Name} %{Last Name} was a great poet.' % hash

// The Allama Iqbal was a great poet.