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

Uso:¿Cuál es la diferencia entre% w {} y% W {} por ciento mayúsculas y minúsculas literales de matriz W en Ruby?

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"] 

Mi pregunta es ... ¿cuál es la diferencia?

Respuesta

59

%W trata las cadenas como comillas dobles, mientras que %w las trata como citas simples (y por lo tanto no interpolará expresiones o numerosas secuencias de escape). Prueba tus matrices de nuevo con expresiones ruby ​​y verás una diferencia.

Ejemplo:

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

Compruebe la edición, me gusta su ejemplo, lo explica mucho. La salida de las dos últimas líneas en mi ejemplo me confunde. – RyanScottLewis

+0

Nuevamente, no estás usando una expresión de rubí, no está rodeada por "# {}". La barra diagonal inversa es un personaje especial en Ruby que se usa para interpretar literalmente otros caracteres especiales, y lo está usando en el contexto de una cadena, no de una expresión. Eso explica por qué las barras diagonales inversas se recuperan en la comilla doble y no en la comilla simple. – acconrad

+1

Creo que el punto de c00lryguy es más profundo. 1) A pesar de que ''\'' = '" \\ "', la barra invertida desapareció con '% w {}'. 2) También hay una pregunta general de cuándo se ignora una barra inversa como en '" \ W "' = '" W "' como se ve con '% W {}'. – sawa

2

He aquí un ejemplo de acconrads respuesta:

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

Puedes acortar '# {@ foo}' a '# @ foo'. – sawa

5

Vamos a saltar la confusión matriz y hablar de interpolación frente a ninguno:

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

La diferencia en el comportamiento es coherente con el comportamiento de las cadenas de comillas simples frente a comillas dobles.

Cuestiones relacionadas