Ruby 数组: %w 与 %W

170

有何不同之处?


18
"%w" 是我通常用来回应那些过于自信地认为 Ruby 可读性很高的人的一句话。这句话每次都有效。 - Craig Stuntz
现在您有一个更好的响应 :-) - errata
6
作为一条不相关的侧面说明,加载页面时这个问题的URL让我感到困惑了一段时间。 - anon
7个回答

266

%w引号类似单引号''(没有变量插值,更少的转义序列),而%W引号类似双引号""

irb(main):001:0> foo="hello"
=> "hello"
irb(main):002:0> %W(foo bar baz #{foo})
=> ["foo", "bar", "baz", "hello"]
irb(main):003:0> %w(foo bar baz #{foo})
=> ["foo", "bar", "baz", "\#{foo}"]

你的示例中,%w 也使用了双引号。这是正确的吗? - Foton
1
是的。在输出时,Ruby总是使用双引号并转义像#这样的字符。'#{foo}'"\#{foo}"会给你相同的字符串,你可以在irb中通过'#{foo}' == "\#{foo}"来验证。 - Brian Campbell
第一眼看起来有点混乱,但感谢您的解释。 - Foton

29

我发现了一个使用 %W 和 %w 的应用:

greetings = %W(hi hello #{"how do you do"})
# => ["hi", "hello", "how do you do"]

12
虽然在这种情况下,可能更容易只是执行“greetings = %w(hi hello how\ do\ you\ do)”。 - dinjas

21

%W执行双引号的普通替换。 %w不会执行替换。


13

虽然这是一个旧帖子,但这个问题一直存在,而答案似乎并不总是很清楚。所以这是我的想法。

%w和%W是通用分隔输入类型的示例,与数组相关。还有其他类型,包括%q、%Q、%r、%x和%i。

大小写之间的区别在于它为我们提供了单引号和双引号的功能。对于单引号和小写的%w,我们没有代码插值(例如#{someCode})和适用的转义字符范围受限(例如\、\n)。而对于双引号和大写的%W,我们可以使用这些功能。

用于分隔符的字符可以是任何字符,而不仅仅是开放括号。尝试上面的示例,以查看其效果。

关于%w和完整列表、转义字符和分隔符的示例,请完整阅读:http://cyreath.blogspot.com/2014/05/ruby-w-vs-w-secrets-revealed.html

Mark


1
这是一篇好文章。我没有意识到你可以用相同的方式创建字符串或其他东西,而且封闭字符可以是任何你想要的。例如,%w&readable af& - Dex

3

2

%W 用于类似于双引号的数组元素,例如 %Q

foo = "!"
%W{hello world #{foo}} # => ["hello", "world", "!"]

%w用于单引号数组元素,比如%q

%w(hello world #{foo})
# => ["hello","world", "\#{foo}"]

0
array = %w(a b c d) 

同样的

array = ["a", "b", "c", "d"]

%w 是字符串中引号的快捷符号!


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