¿Qué significa% w (array)?

837

Estoy mirando la documentación de FileUtils.

Estoy confundido por la siguiente línea:

FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'

¿Qué significa %weso? ¿Me puede indicar la documentación?

Dane O'Connor
fuente

Respuestas:

1246

%w(foo bar)es un acceso directo para ["foo", "bar"]. Lo que significa que es una notación escribir una matriz de cadenas separadas por espacios en lugar de comas y sin comillas a su alrededor. Puede encontrar una lista de formas de escribir literales en la referencia rápida de zenspider .

sepp2k
fuente
199
Además, el paréntesis puede ser casi cualquier otro carácter, como corchetes% w [...], llaves 8% w {...} o incluso algo como signos de exclamación% w! ...!. Todos estos tienen el mismo comportamiento (devolver una matriz).
ryanb
143
La forma más fácil de recordar mnemónicamente lo que esto significa es "matriz separada por espacios en blanco (w)".
Julik
77
Ver "Entrada general delimitada" aquí ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck
121
Si la cadena tiene espacios, simplemente escapa de ellos con \. Ej .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy
66
Supongo que esta página también habría resuelto la pregunta: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor
471

Pienso %w()en un "conjunto de palabras": los elementos están delimitados por espacios y devuelve un conjunto de cadenas.

Hay otros% literales:

  • %r() Es otra forma de escribir una expresión regular.
  • %q() es otra forma de escribir una cadena entre comillas simples (y puede ser de varias líneas, lo cual es útil)
  • %Q() da una cadena entre comillas dobles
  • %x() es un comando de shell
  • %i() da una serie de símbolos (Ruby> = 2.0.0)
  • %s()se convierte fooen un símbolo ( :foo)

No conozco a nadie más, pero puede haber algo acechando allí ...

Mike Woodhouse
fuente
32
A partir de Ruby 2.0.0 también puede usar %i()para generar una serie de símbolos.
David Tuite
10
También hay %()(o %[]o %{}) que da una cadena entre comillas dobles y se escapa comillas dobles, como %Q(). Ej .%("sender name" <[email protected]>) # => "\"sender name\" <[email protected]>"
Dennis el
59

También hay %sque le permite crear cualquier símbolo, por ejemplo:

%s|some words|          #Same as :'some words'
%s[other words]         #Same as :'other words'
%s_last example_        #Same as :'last example'

Desde Ruby 2.0.0 también tienes:

%i( a b c )   # => [ :a, :b, :c ]
%i[ a b c ]   # => [ :a, :b, :c ]
%i_ a b c _   # => [ :a, :b, :c ]
# etc...
Eraden
fuente
22

Aunque es una publicación antigua, la pregunta sigue apareciendo y las respuestas no siempre me parecen claras, así que aquí están mis pensamientos:

%wy %Wson ejemplos de tipos de entrada delimitados generales , que se relacionan con matrices. Hay otros tipos que incluyen %q, %Q, %r, %xy %i.

La diferencia entre la versión en mayúsculas y minúsculas es que nos da acceso a las características de comillas simples y dobles. Con comillas simples y (minúsculas) %w, no tenemos interpolación de código ( #{someCode}) y un rango limitado de caracteres de escape que funcionan ( \\, \n). Con comillas dobles y (mayúsculas) %Wque tienen acceso a estas características.

El delimitador utilizado puede ser cualquier carácter, no solo el paréntesis abierto. Juega con los ejemplos anteriores para ver eso en efecto.

Para una redacción completa con ejemplos %wy la lista completa, caracteres de escape y delimitadores, eche un vistazo a "¡ Ruby -% w vs% W - secretos revelados! "

Mark C
fuente
17

En lugar de %w()usar%w[]

De acuerdo con la guía de estilo Ruby:

Prefiera% w a la sintaxis de matriz literal cuando necesite una matriz de palabras (cadenas no vacías sin espacios y caracteres especiales en ellas). Aplique esta regla solo a las matrices con dos o más elementos.

# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w[draft open closed]

Use las llaves más apropiadas para los diversos tipos de literales porcentuales.

[]para los literales de matriz ( %w, %i, %W, %I), ya que está alineado con los literales de matriz estándar.

# bad
%w(one two three)
%i(one two three)

# good
%w[one two three]
%i[one two three]

Para más lee aquí .

Rajkaran Mishra
fuente
11

Extraído de la documentación de Percent Strings en http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Además de% (...) que crea una Cadena, el% puede crear otros tipos de objetos. Al igual que con las cadenas, una letra mayúscula permite la interpolación y los caracteres escapados, mientras que una letra minúscula los desactiva.

Estos son los tipos de cadenas porcentuales en ruby:
...
% w : Array of Strings

itsnikolay
fuente
2
Geez gracias! Estaba empezando a pensar que no existía. Los enlaces de rubydoc proporcionados por otros están rotos.
Gerry
La documentación no era para estos no se incluyó en los RubyDocs durante bastante tiempo.
The Tin Man
2

Me dieron un montón de columnas de una hoja de cálculo CSV de nombres completos de usuarios y necesitaba mantener el formato, con espacios. La forma más fácil que encontré para obtenerlos mientras usaba Ruby fue hacer:

names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')

Esto resalta que %()crea una cadena como "Porter Smith\nJimmyJones\nRonald Jackson"y para obtener la matriz que splitla cadena en el"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Entonces, para responder también a la pregunta original del OP, podrían haber escrito %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')si sucedió spacecuando quieres spaceque exista en la salida de la matriz final.

pjammer
fuente