何时使用%w?

时间:2013-05-10 07:16:35

标签: ruby arrays

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

arr = %w(abc def ghi jkl)

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

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

在上面的例子中,我想要一个数组["abc", "def", "ghi", "jkl"]。哪种方式比较理想:前者(%w)或后者?

4 个答案:

答案 0 :(得分:5)

何时使用%w[...]与常规数组?我确信你只需要看两者,然后输入它们,然后思考你刚刚做了什么就能想出原因。

如果您要将单个单词列表转换为数组,请使用%w[...]。当我想要循环的参数或者我知道将来要添加的命令时,我使用它,因为%w[...]可以很容易地向数组中添加新元素。阵列的定义中的视觉噪声较少。

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

所以,你选择何时使用其中一个或哪一个对你最有意义。它被称为“程序员的选择”。

答案 1 :(得分:0)

正如您所正确指出的那样,它们会产生相同的结果。因此,在决定时,选择一个产生更简单代码的方法。在这种情况下,它是%w运算符。对于previous question,它是数组文字。

答案 2 :(得分:0)

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

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

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

What does %w(array) mean?

中提供了更多信息

答案 3 :(得分: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命令的`backtick的替代),%r(正则表达式语法的替代方法,当正则表达式中包含大量/字符时有用)不想逃避他们)最后%s(因为符号而被起诉)。