Pregunta ¿Qué significa% w (array)?


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'

Lo que hace el %w ¿media? ¿Puedes señalarme la documentación?


701
2017-08-13 21:23


origen


Respuestas:


%w(foo bar) es un atajo para ["foo", "bar"]. Lo que significa que es una notación para 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 el refrendo rápido de zenspider.


1043
2017-08-13 21:28



pienso %w() como una "matriz de palabras": los elementos están delimitados por espacios.

Hay otros% literales:

  • %r() es otra forma de escribir una expresión regular.
  • %q() es otra forma de escribir una cadena de una sola cita (y puede ser multilínea, lo cual es útil)
  • %Q() da una cadena de doble cita
  • %x() es un comando de shell
  • %i() da una matriz de símbolos (Ruby> = 2.0.0)
  • %s() vueltas foo en un símbolo (:foo)

No conozco a otros, pero puede haber algunos acechando por ahí ...


394
2017-08-13 23:06



También hay %s que 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...

56
2017-07-23 20:16



%W y %w le permite crear una matriz de cadenas sin usar comillas y comillas.


29
2017-08-13 21:28



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

%w y %W son ejemplos de entrada general delimitada tipos, que se relacionan con Arrays. Hay otros tipos que incluyen %q, %Q, %r, %x y %i.

La diferencia entre la versión de 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) %W nosotros hacer tener acceso a estas características.

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

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


18
2018-05-30 08:00



Extraído de la documentación para cadenas de porcentaje 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 deshabilita.

Estos son los tipos de cadenas de porcentajes en ruby:
  ...
% w: Matriz de cuerdas


10
2018-03-13 07:44



En lugar de %w() deberíamos usar %w[]

De acuerdo con la guía de estilo Ruby:

Prefiere% w a la sintaxis de matriz literal cuando necesitas una matriz de palabras (cadenas no vacías sin espacios ni 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]

Utilice las llaves que sean las más apropiadas para los diversos tipos de literales porcentuales.

[]para 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 leer más aquí.


9
2018-05-26 07:46



Me dieron varias columnas de una hoja de cálculo CSV con los nombres completos de los 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 split la cuerda en el "\n"  ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Entonces, para responder la pregunta original del OP, podrían haber escrito %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') si sucedió que hay space cuando quieras space para existir en la salida del conjunto final.


0
2017-09-08 15:32