关于ruby:何时使用%w?

When to use %w?

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

1
arr = %w(abc def ghi jkl)

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

在哪些情况下应使用%w

在上面的例子中,我需要一个数组["abc","def","ghi","jkl"]。最理想的方法是:前者(使用%w)还是后者?


何时使用%w[...]与常规数组?我敢肯定,你只要看看这两个就可以想出原因,然后把它们打进去,想想你刚才做了什么。

当你有一个单字列表要变成一个数组时,使用%w[...]。当我有我想要循环的参数或者我知道将来要添加的命令时,我就使用它,因为%w[...]使向数组添加新元素变得容易。数组定义中的视觉噪声较小。

如果有嵌入空白的元素可以欺骗%w,则使用常规字符串数组。用于必须包含非字符串元素的数组。在"'中使用中间逗号将元素封闭会导致视觉噪声,但也可以使用任何对象类型创建数组。

所以,当一个或另一个对你来说最有意义的时候,你可以选择使用它。这叫做"程序员的选择"。


这就是我记忆的方式:

%q/%q用于字符串

%Q用于双引号字符串(对于一个字符串中有多个引号字符时很有用)。

而不是这样做:

1
"I said "Hello World""

你可以这样做:

1
%Q{I said"Hello World"}

%q表示单引号字符串(记住单引号字符串不支持字符串内插或转义序列,例如。.当我说不"支持"时,我的意思是单引号字符串将需要将转义序列作为特殊字符处理,换句话说,转义序列将只是字符串文字的一部分)

而不是这样做:

1
‘I said \’Hello World\’’

你可以这样做:

1
%q{I said 'Hello World'}

但请注意,如果字符串中有转义序列,则不会对其进行处理,而是将其视为文本反斜杠和N字符:

1
2
3
4
5
6
result = %q{I said Hello World
}
 =>"I said Hello World\
"

puts result
I said Hello World

请注意,文本未被视为换行符,但它具有%q:

1
2
3
4
5
6
result =  %Q{I said Hello World
}
 =>"I said Hello World
"

puts result
I said Hello World

%w/%w用于数组元素

%w用于双引号数组元素。这意味着它将支持字符串插值和转义序列:

而不是这样做:

1
2
3
orange ="orange"
result = ["apple","#{orange}","grapes"]
 => ["apple","orange","grapes"]

您可以这样做:

1
2
3
4
5
6
7
8
result = %W(apple #{orange} grapes
)
 => ["apple","orange","grapes
"
]
puts result
apple
orange
grapes

请注意,转义序列导致葡萄后换行符中断。这不会发生在%w中。对单引号数组元素使用了%w。当然,单引号字符串不支持插值和转义序列。

而不是这样做:

1
result = [‘a’, ‘b’, ‘c’]

你可以这样做:

1
result = %w{a b c}

但是看看当我们这样做时会发生什么:

1
2
3
4
5
6
7
8
result = %w{a b c
}
 => ["a","b","c\
"
]
puts result
a
b
c

请记住,不要将这些构造与%x(用于运行unix命令的"backtick"的替代方法)、%r(用于//正则表达式语法的替代方法)以及最后的%s(用于符号)混淆。


使用%w可以避免在字符串周围使用引号。

此外,还有更多类似的快捷方式:

1
2
3
4
5
%W - double quotes
%r - regular expression  
%q - single-quoted string
%Q - double-quoted string
%x - shell command

有关详细信息,请参阅"%w(array)是什么意思?"


正如您正确指出的,它们产生相同的结果。因此,在决定时,选择一个产生更简单代码的代码。在这种情况下,它是%w操作符。在前面的问题中,它是数组文字。