¿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?

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 .


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í ...


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" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
— 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...


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 sí 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! "


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í .


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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.