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

使用法:%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は一重引用符として扱います(したがって、式や多数のエスケープシーケンスを補完しません)。あなたの配列をもう一度ルビー式で試してみましょう。違いが見えます。

例:

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

編集を確認してください、私はあなたの例が気に入っています。私の例の最後の2行の出力は私を混乱させます。 – RyanScottLewis

+0

もう一度、あなたは "#{}"で囲まれていないルビ表現を使用していません。バックスラッシュは、他の特殊文字を文字通り解釈するために使用されるRubyの特殊文字です。文字列のコンテキストではなく式を使用しています。これは、バックスラッシュがシングルクォートではなくダブルクォートでバウンスしている理由を説明しています。 – acconrad

+1

私はc00lryguyのポイントが深いと思います。 1) ''\'' = '' \\ "'であっても、バックスラッシュは '%w {}'でなくなっています。 2) '%W {} 'で見られる' '\ W" '=' "W" 'のように、バックスラッシュが無視されるときの一般的な質問もあります。 – sawa

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

5

のは、配列の混乱をスキップし、いずれも対補間についてお話しましょう:

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

挙動の違い一重引用符で囲まれた文字列と二重引用符で囲まれた文字列がどのように動作するかと一貫しています

関連する問題