为什么没有键的格式化字符串 return 本身?

Why does a formatted string with no keys return itself?

考虑这个 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)"

虽然下面的代码 returns 是 format_string 变量的确切值,即使它缺少两个键。 我希望该值是等于 nil,或者导致像上面的代码那样的错误。

puts format_string      # returns "%{greeting: "Hi", name: "John"}"

我正在寻找有关在没有为字符串设置键或变量时如何以及为何返回确切值的解释。 我已经通读了 ruby 文档和多个与 ruby 格式相关的网页,但我还没有找到答案。

你的:

puts format_string

打印 format_string 因为那是 puts 所做的。您所看到的格式化(并抱怨缺少密钥)是由 String#% 方法完成的; puts 不解释字符串中的 %{...} 内容, % 运算符执行此操作。也许把它分成两步(并且更符合你的白色space)会为你澄清事情:

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