2011-04-22 79 views
41
%w[ ] Non-interpolated Array of words, separated by whitespace 
%W[ ] Interpolated Array of words, separated by whitespace 

用法:Ruby中的%w {}和%W {}大小写W数组字面量有什么区别?

p %w{one one two three 0 1 1 2 3} # = > ["one", "one", "two", "three", "0", "1", "1", "2", "3"] 
p %W{one one two three 0 1 1 2 3} # = > ["one", "one", "two", "three", "0", "1", "1", "2", "3"] 
p %w{C:\ C:\Windows} # => ["C: C:\\Windows"] 
p %W{C:\ C:\Windows} # => ["C: C:Windows"] 

我的问题是...有什么区别?

回答

59

%W将字符串视为双引号,而%w将它们视为单引号(因此不会插入表达式或多个转义序列)。用ruby表达式再次尝试你的数组,你会看到不同之处。

例:

myvar = 'one' 
p %w{#{myvar} two three 1 2 3} # => ["\#{myvar}", "two", "three", "1", "2", "3"] 
p %W{#{myvar} two three 1 2 3} # => ["one", "two", "three", "1", "2", "3"] 
+1

检查编辑,我喜欢你的例子,它解释了很多。在我的例子中最后两行的输出让我困惑。 – RyanScottLewis 2011-04-22 03:01:10

+0

同样,你没有使用Ruby表达式,它没有被“#{}”包围。反斜杠是Ruby中的一个特殊字符,用于从字面上解释其他特殊字符,并且您在字符串的上下文中使用该字符,而不是表达式。这就解释了为什么反斜杠在双引号中反弹而不是单引号。 – acconrad 2011-04-22 03:04:13

+1

我认为c00lryguy的观点更深入。 1)尽管'\''='“\\”',反斜杠与'%w {}'一起消失了。 2)在''W \''''''W''中,如'%W {}'所示,反斜杠被忽略的时间也是一个普遍的问题。 – sawa 2011-04-22 03:16:19

2

下面是一个例子来acconrads回答:

ruby-1.8.7-p334 :033 > @foo = 'bar' 
=> "bar" 
ruby-1.8.7-p334 :034 > %w(#{@foo}) 
=> ["\#{@foo}"] 
ruby-1.8.7-p334 :035 > %W(#{@foo}) 
=> ["bar"] 
+2

您可以将'#{foo}'缩短为'#@ foo'。 – sawa 2011-04-22 03:01:18

5

让我们跳过该阵列的混乱和谈论的插值与无:

irb(main):001:0> [ 'foo\nbar', "foo\nbar" ] 
=> ["foo\\nbar", "foo\nbar"] 
irb(main):002:0> [ 'foo\wbar', "foo\wbar" ] 
=> ["foo\\wbar", "foowbar"] 

行为的差异与单引号与双引号字符串的行为是一致的。

相关问题