考虑一下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格式相关的网页,但我仍然无法找到答案。
2条答案
按热度按时间k4ymrczo1#
贵方:
打印
format_string
,因为这就是puts
所做的。您看到的格式化(以及抱怨缺少键)是由String#%
方法完成的;puts
并不解释字符串中的%{...}
内容,%
操作符可以做到这一点。也许将其分为两个步骤(并与您的空格更一致)将为您澄清事情:format_string % hash
中的%
只是一个像其他任何操作符一样的操作符,%{
在使用%
操作符的字符串之外没有特殊的含义,因此删除操作符(%
)和散列操作数的左括号({
)之间的空格会产生误导。7z5jn7bk2#
Ruby的设计很糟糕。我们应该能够实现部分替换,一次一个键,没有KeyErrors。这个全有或全无的规则没有经过很好的考虑。