何时使用%w?

4
以下两条语句将产生相同的结果:
arr = %w(abc def ghi jkl)

and

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

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

在上面的情况中,我想要一个数组["abc", "def", "ghi", "jkl"]。哪种方式更理想:前者(使用%w)还是后者?


使用%w,您无需转义双引号,代码看起来更酷。使用%w的两个好理由。 - oldergod
3
@oldergod嵌入引号但没有嵌入空格是相当罕见的。 - user24359
4个回答

5
何时使用%w[...]和普通数组?只需看一眼这两个选项,然后输入它们并思考一下你刚才所做的事情,就可以想出使用它们的原因。
当您有一个单词列表要转换为数组时,请使用%w[...]。我在参数循环或我知道将来需要添加的命令时使用它,因为%w[...]使添加新元素到数组变得很容易。定义数组时会减少视觉噪音。
当您的元素包含空格时,使用常规字符串数组,以避免被%w误解。对于必须包含非字符串元素的数组,请使用常规字符串数组。用逗号隔开"'之间的元素会造成视觉噪音,但它也可以创建任何对象类型的数组。
因此,您可以根据自己的需要选择使用其中之一。这被称为“程序员的选择”。

你可以转义空格:%w(one\ word another\ word) - Stefan
3
@Stefan,是的,你可以这样做,但这会破坏使用%w的目的,并且会增加视觉噪声问题,最好使用带引号的字符串来修复它。 - the Tin Man
+1 对于“视觉噪音”的描述非常准确。 - 0xCAFEBABE
1
@theTinMan 这取决于个人看法。在我看来,%w[int short long long\ long]["int", "short", "long", "long long"] 更清晰简洁。 - Stefan
相比于您之前的例子,这是一个折中的情况。此时,程序员再次可以自行选择。个人而言,我会利用源代码中的布局来提高可读性,因为将所有内容放在一行上时会使其变得模糊不清。 - the Tin Man
显示剩余2条评论

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 会导致在grapes后面有一个换行符。这不会发生在%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(用于符号)。


0

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

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

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

更多信息可在 "%w(array) 是什么意思?" 中获得


0

正如您所指出的那样,它们生成相同的结果。因此,在决定时,请选择产生更简单代码的一个。在这种情况下,它是%w运算符。在您的上一个问题的情况下,它是数组字面量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接