以下两个语句将产生相同的结果:
arr = %w(abc def ghi jkl)
和
arr = ["abc", "def", "ghi", "jkl"]
应该在哪些情况下%w
使用?
在上述情况下,我想要一个数组["abc", "def", "ghi", "jkl"]
。哪种方式最理想:前者(带%w
)还是后者?
何时使用%w[...]
与常规数组?我相信你可以通过查看这两个,然后输入它们,然后想想你刚刚做了什么来想出原因。
%w[...]
当您有要转换为数组的单个单词列表时使用。当我有要循环的参数或我知道将来要添加的命令时,我会使用它,因为%w[...]
这样可以轻松地将新元素添加到数组中。数组定义中的视觉噪音较少。
当您的元素嵌入了会欺骗的空白时,请使用常规的字符串数组%w
。将它用于必须包含非字符串元素的数组。将元素括在内部"
并'
用逗号插入会导致视觉噪音,但它也可以创建具有任何对象类型的数组。
因此,您可以在对您最有意义的时候选择何时使用其中一种。它被称为“程序员的选择”。
As you correctly noted, they generate the same result. So, when deciding, choose one that produces simpler code. In this case, it's the %w
operator. In the case of your previous question, it's the array literal.
Using%w
允许您避免在字符串周围使用引号。
此外,还有更多这样的快捷方式:
%W - double quotes
%r - regular expression
%q - single-quoted string
%Q - double-quoted string
%x - shell command
“ %w(array) 是什么意思? ”中提供了更多信息。
这是我记得的方式:
%Q/%q 用于字符串
%Q 用于双引号字符串(当字符串中有多个引号字符时很有用)。
而不是这样做:
“I said \“Hello World\””
你可以做:
%Q{I said “Hello World”}
%q 用于单引号字符串(请记住单引号字符串不支持字符串插值或转义序列,例如 \n。当我说不“支持”时,我的意思是单引号字符串需要将转义序列作为特殊处理字符,换句话说,转义序列将只是字符串文字的一部分)
而不是这样做:
‘I said \’Hello World\’’
你可以做:
%q{I said 'Hello World'}
但请注意,如果您在字符串中有转义序列,则不会对其进行处理,而是将其视为文字反斜杠和 n 字符:
result = %q{I said Hello World\n}
=> "I said Hello World\\n"
puts result
I said Hello World\n
请注意,文字 \n 没有被视为换行符,但它与 %Q 一起使用:
result = %Q{I said Hello World\n}
=> "I said Hello World\n"
puts result
I said Hello World
%W/%w 用于数组元素
%W 用于双引号数组元素。这意味着它将支持字符串插值和转义序列:
而不是这样做:
orange = "orange"
result = ["apple", "#{orange}", "grapes"]
=> ["apple", "orange", "grapes”]
你可以这样做:
result = %W(apple #{orange} grapes\n)
=> ["apple", "orange", "grapes\n"]
puts result
apple
orange
grapes
请注意转义序列 \n 在葡萄之后导致换行符。%w 不会发生这种情况。%w 用于单引号数组元素。当然,单引号字符串不支持插值和转义序列。
而不是这样做:
result = [‘a’, ‘b’, ‘c’]
你可以做:
result = %w{a b c}
但是看看当我们尝试这个时会发生什么:
result = %w{a b c\n}
=> ["a", "b", "c\\n"]
puts result
a
b
c\n
请记住,不要将这些结构与 %x (用于运行 unix 命令的 ` 反引号的替代方案)、%r (当您的正则表达式中有很多 / 字符并且不希望使用正则表达式语法时的替代方案)混淆逃避它们),最后是 %s (被起诉符号)。