Ruby % 运算符

Ruby % operator

我无法理解以下代码片段的作用

"foo = %{foo}" % { :foo => 'bar' }
=> "foo = bar"

所以根据理解,"foo = %{foo}" 是格式规范,但在这种情况下,它似乎使用 %{foo}?

执行变量插值

String#% 使用给定的字符串作为格式规范,并应用参数(数组/散列)和 return 结果字符串。

%{...} 是按名称格式引用。还有 %<...> 也需要格式样式 (s, d, f, ...)

"foo = %{key}" % { :key => 'bar' }
# => "foo = bar"
"foo = %<key>s" % { :key => 'bar' }
# => "foo = bar"

有关格式规范的更多详细信息,请参阅 Kernel#sprintf

doc of String#% refers to sprintf.

sprintf 的文档末尾,您将找到对使用名称(带有散列参数)而不是位置(带有数组参数)的两种替换类型的简要说明。

解释这样的事情的简单方法是查看该行的第一部分,这是一个字符串文字 (foo = %{foo}),因此 % 符号表示字符串的 % 方法 (String#%),所以文字实际上是格式规范的第一部分,即字符串的呈现方式。 % 之后的部分必须是数组或散列,在本例中是进行命名替换的散列,这意味着 key 是散列中必须存在的键的名称,返回值 bar

你可以用正常的替换来写这个,但是你需要两行代码。

hash = { :key => 'bar' }
"foo = #{hash[:key]}" 

或者只使用一个变量

foo = "bar"
"foo = #{foo}"

如果不涉及其他内容,则更具可读性。