为什么没有键的格式化字符串会自行返回?

时间:2017-06-20 23:27:42

标签: ruby string-formatting

考虑这个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格式有关的多个网页,但我还没有找到答案。

1 个答案:

答案 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只是一个与其他运算符一样的运算符,%{在您使用%运算符的字符串之外没有特殊含义,因此删除之间的空格哈希操作数的运算符(%)和左大括号({)具有误导性。