以下两个语句将生成相同的结果:
arr = %w(abc def ghi jkl)
和
arr = ["abc", "def", "ghi", "jkl"]
在哪些情况下应该使用%w
?
在上面的例子中,我想要一个数组["abc", "def", "ghi", "jkl"]
。哪种方式比较理想:前者(%w
)或后者?
答案 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
中提供了更多信息
答案 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(因为符号而被起诉)。