考虑这个Ruby代码:
format_string = "%{greeting}, %{name}"
puts format_string %{greeting: "Hi", name: "John"} # <-- returns "Hi, John"
puts format_string # <-- returns "%{greeting}, %{name}"
puts format_string %{greeting: "Hi"} # <-- returns key{name} not found (KeyError)"
以下代码产生错误,因为它缺少密钥。
puts format_string %{greeting: "Hi"} # returns "key{name} not found (KeyError)"
虽然下面的代码返回format_string变量的确切值,即使它缺少两个键。我希望该值等于nil,或者导致错误,如上面的代码
puts format_string # returns "%{greeting: "Hi", name: "John"}"
我正在寻找一个解释,当没有为字符串设置任何键或变量时,返回确切值的方式和原因。 我已经阅读了ruby文档和与ruby格式有关的多个网页,但我还没有找到答案。
答案 0 :(得分:2)
您:
puts format_string
打印format_string
,因为这是puts
的作用。您看到的格式(以及对丢失密钥的抱怨)是由String#%
方法完成的; puts
不会解释字符串中的%{...}
内容,%
运算符会执行此操作。也许将它分成两个步骤(并且与你的空白更加一致)将为你澄清一些事情:
formatted_string = format_string % {greeting: "Hi", name: "John"}
# -------------------------------^ Just an operator like any other, %{ has no special meaning outside the string you use the % operator on.
puts formatted_string
%
中的format_string % hash
只是一个与其他运算符一样的运算符,%{
在您使用%
运算符的字符串之外没有特殊含义,因此删除之间的空格哈希操作数的运算符(%
)和左大括号({
)具有误导性。