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 %w
eso? ¿Me puede indicar la documentación?
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 %w
eso? ¿Me puede indicar la documentación?
Respuestas:
%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 .
%w(ab\ c def) # => ["ab c", "def"]
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 foo
en un símbolo ( :foo
)No conozco a nadie más, pero puede haber algo acechando allí ...
%i()
para generar una serie de símbolos.
%()
(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>"
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...
%W
y le%w
permite crear una matriz de cadenas sin utilizar comillas y comillas.
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:
%w
y %W
son ejemplos de tipos de entrada delimitados generales , que se relacionan con matrices. Hay otros tipos que incluyen %q
, %Q
, %r
, %x
y %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) %W
que 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 %w
y la lista completa, caracteres de escape y delimitadores, eche un vistazo a "¡ Ruby -% w vs% W - secretos revelados! "
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í .
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
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 split
la 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ó space
cuando quieres space
que exista en la salida de la matriz final.