4

以下两个语句将产生相同的结果:

arr = %w(abc def ghi jkl)

arr = ["abc", "def", "ghi", "jkl"]

应该在哪些情况下%w使用?

在上述情况下,我想要一个数组["abc", "def", "ghi", "jkl"]。哪种方式最理想:前者(带%w)还是后者?

4

4 回答 4

5

何时使用%w[...]与常规数组?我相信你可以通过查看这两个,然后输入它们,然后想想你刚刚做了什么来想出原因。

%w[...]当您有要转换为数组的单个单词列表时使用。当我有要循环的参数或我知道将来要添加的命令时,我会使用它,因为%w[...]这样可以轻松地将新元素添加到数组中。数组定义中的视觉噪音较少。

当您的元素嵌入了会欺骗的空白时,请使用常规的字符串数组%w。将它用于必须包含非字符串元素的数组。将元素括在内部"'用逗号插入会导致视觉噪音,但它也可以创建具有任何对象类型的数组。

因此,您可以在对您最有意义的时候选择何时使用其中一种。它被称为“程序员的选择”。

于 2013-05-10T07:20:20.857 回答
0

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.

于 2013-05-10T07:18:55.690 回答
0

Using%w允许您避免在字符串周围使用引号。

此外,还有更多这样的快捷方式:

%W - double quotes
%r - regular expression  
%q - single-quoted string
%Q - double-quoted string
%x - shell command

“ %w(array) 是什么意思? ”中提供了更多信息。

于 2013-05-10T07:31:11.883 回答
0

这是我记得的方式:

%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 (被起诉符号)。

于 2018-04-14T15:41:03.807 回答