tutorial - ¿En qué parte del lenguaje de Ruby se define% q,% w, etc.?
ruby wikipedia (4)
[Esta nota es en respuesta a la discusión entre Will y el hombre de hojalata el 30 de mayo de 2012 sobre el tema de los literales de expresiones regulares que parecen "% r ... /" en los documentos de Ruby. Parece que no puedo agregar un comentario directamente a esa discusión, pero tal vez alguien con privilegios apropiados pueda mover esta información allí ...]
La documentación general de la clase Ruby se genera a partir de comentarios RDoc
integrados en el código fuente de cada clase en cuestión. Esos comentarios de origen tienen la sintaxis correcta para los literales de expresiones regulares, como se puede ver al consultar la documentación de texto que se muestra a través de ri Regexp
, utilizando versiones HTML de la documentación generadas localmente, etc.
Sin embargo, durante un período de esta primavera, la versión de RDoc
utilizada para generar las páginas de documentación en www.ruby-doc.org contenía un error que hacía que los literales de expresiones regulares se mostraran como "%r.../"
lugar de "/.../"
. A partir del 9 de junio, sin embargo, ese error se corrigió y las páginas "core" y "std-lib" se regeneraron, por lo que los literales de expresiones regulares se muestran correctamente de nuevo en ese sitio.
(Hay otras categorías de documentación en el sitio que se generan por separado, pero si alguna de esas páginas aún muestra el formato incorrecto, también deberían solucionarse cuando finalmente se reconstruyan).
Gran parte del lenguaje de Ruby es más métodos que sintaxis, por lo que esperaba encontrar %q
, %w
, etc., definidos como métodos en la clase Kernel
. Sin embargo, no están allí.
Entonces, ¿dónde están definidos? ¿Son palabras clave de lenguaje?
Están "codificados" en el analizador; ver
La forma más fácil de encontrar el código en cuestión es buscar la segunda aparición de str_sword
(WORDs comillas simples). Toda la sintaxis de "entrada delimitada" se define allí: %Q
, %q
, %W
, %w
, %x
, %r
y %s
(ambas versiones mencionadas anteriormente definen el mismo conjunto de marcadores de entrada delimitados).
No son palabras clave, son macros. Es difícil encontrar una referencia oficial para ellos, pero hay una here .
Programación Ruby los menciona en el capítulo sobre cadenas .
Relacionado con %q{}
y %Q{}
está %{}
que es lo mismo que %Q{}
. Además, los delimitadores " {}
" que muestro pueden ser un par de delimitadores coincidentes, por lo que podría usar []
, ()
, etc. %q{}
es lo mismo que usar comillas simples para delimitar una cadena. %Q{}
es lo mismo que usar comillas dobles, permitiendo interpolar cadenas incrustadas:
%q{foobar} # => "foobar"
%Q{foobar} # => "foobar"
asdf = ''bar'' # => "bar"
%q{foo#{asdf}} # => "foo/#{asdf}"
%Q{foo#{asdf}} # => "foobar"
Además, hay %w{}
que divide una cadena usando espacios en blanco, en una matriz. Por ejemplo:
%w[a b c] # => ["a", "b", "c"]
%w{}
no interpola variables incrustadas:
%w[a b asdf] # => ["a", "b", "asdf"]
%w[a b #{asdf}] # => ["a", "b", "/#{asdf}"]
Y %r{}
que define una expresión regular:
%r{^foo}.class # => Regexp
Finalmente, hay %x{}
que actúa como comillas invertidas, es decir, "` `", pasando la cadena al sistema operativo subyacente. Piense en ello como "exec":
%x{date} # => "Fri Nov 26 15:08:44 MST 2010/n"
Muchas de las ideas de Ruby para estos atajos provienen de Perl, solo en Perl usan q{}
, qq{}
, qw{}
, qx{}
y qr{}
. La q
principal significa "cotización", y son tratados y documentados como operadores "cotizantes" si recuerdo bien. La documentación de Ruby necesita ser expandida, y este conjunto particular de herramientas definitivamente podría necesitar algo de ayuda.