ruby 为什么一个没有键的格式化字符串会返回它自己?

1cosmwyk  于 2023-04-05  发布在  Ruby
关注(0)|答案(2)|浏览(112)

考虑一下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格式相关的网页,但我仍然无法找到答案。

k4ymrczo

k4ymrczo1#

贵方:

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中的%只是一个像其他任何操作符一样的操作符,%{在使用%操作符的字符串之外没有特殊的含义,因此删除操作符(%)和散列操作数的左括号({)之间的空格会产生误导。

7z5jn7bk

7z5jn7bk2#

Ruby的设计很糟糕。我们应该能够实现部分替换,一次一个键,没有KeyErrors。这个全有或全无的规则没有经过很好的考虑。

相关问题