2011-04-22 52 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"] 

行爲的差異與單引號與雙引號字符串的行爲是一致的。

相關問題