考虑这个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 格式相关的网页,但我无法找到答案。
你的:
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
中的%
与其他运算符一样只是一个运算符,%{
除了您使用%
运算符的字符串之外没有特殊含义,因此删除运算符 (%
( 和哈希操作数的左大括号 ({
( 之间的空格是误导性的。
Ruby的糟糕设计。 我们应该能够实现部分替换,一次一个键,没有KeyErrors。 这种全有或全无的规则没有经过深思熟虑。