2012-06-04 29 views
8

Me encuentro con la sintaxis del corchete [] bastante en Ruby, pero nunca parece estar haciendo lo mismo. ¿Alguien puede enumerar todos los diferentes usos de los corchetes [] en Ruby por lo que mi mente puede manejar este símbolo aparentemente infinitamente versátil? (¿Cómo es posible que un símbolo puede hacer mucho sin el intérprete de Ruby confundirse?)¿Cuáles son los diferentes usos de los [corchetes] en Ruby?

Ejemplos:

  • [] y []= métodos
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]
+3

Vaya a http://ruby-doc.org/core-1.9.3/ y escriba '[]' en el cuadro de búsqueda "Métodos", que le dará una lista de sus usos en el núcleo. Las clases complementarias pueden, por supuesto, proporcionar sus propias implementaciones para los operadores '[]' y '[] ='. –

+0

¡Dé algunos ejemplos! – Ashe

+0

[] y [] = los métodos no son un problema, ¿qué hay de% w [a b c] y [1,2,3] [1] indexación de matriz? ¿Qué más? '[]' está apareciendo por todos lados y estoy empezando a inquietarme por lo que no sé. –

Respuesta

7

Bien, solo para mis propias notas, he ido y lo he estudiado más de cerca y, construyendo en Holger Just's answer, se presenta lo siguiente: el uso de corchetes en Ruby se puede dividir en 6 usos, 3 de ellos una parte de las definiciones de métodos de Ruby y 3 de ellas construcciones semánticas.

definición del método de creación

de objetos a través de los métodos de la clase Array :: [], Hash :: []

Array.[](1,2,3) #=> [1,2,3]      #Un-sugared notation 
Array["a","b","c"] #=> ["a","b","c"]    #Sugared equivalent 
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} 

nada que ver con los constructores literales, aunque sí la la misma cosa.

Referencia de elementos mediante métodos de instancia Array # [], Bignum # [], Continuación # [], Fixnum # [], Hash # [], MatchData # [], Método # [], ProC# [], Cuerda # [], Struct # [], símbolo # [], hilo # [], y métodos de la clase Dir :: [], ENV :: []

ary = [1,2,"abc", [15,16,[26,27]]] 
ary.[](2) #=> "abc"    #Un-sugared notation 
ary[2] #=> "abc"     #Sugared equivalent 
ary[0,2] #=> [1,2] 
ary[3][2][1] #=> 26 
[1,2,3][0] #=> 1 
"Is a string"[7,3] #=> "rin" 

asignación de elementos a través de los métodos de instancia de array # [] =, de almohadilla # [] =, string # [] =, Struct # [] =, hilo # [] =, y ENV método de clase :: [] =

ary = [1,2,3] 
ary.[]=(1,"abc") #=> [1,"abc",3] #un-sugared notation 
ary[2] = "def" #=> [1,"abc","def"] #Sugared equivalent 
hash = {"a"=>1, "b"=>2} 
hash["a"] = 3 #=> {"a"=>3, "b"=>2} 

construcciones semánticas

creación de objetos a través del constructor literal array

ary = [] 

Hay un montón de constructores literales en Ruby que crear un objeto de la clase correspondiente a través de la utilización de (por lo general) un par de símbolos simples, siendo los corchetes cuadrados el constructor literal de los objetos de matriz: Matriz [], Hash {}, Proc ->(){}, Rango .. y ..., Regexp //, Cadena "" y '', Símbolo : y :"".

creación de objetos a través del% notación

%q[hello there you] #=> "hello there you"   # String % notation 
%w[hello there you] #=> ["hello", "there", "you"] # Array % notation 

No es, estrictamente hablando, la notación de corchetes, sino más bien la notación de dos símbolos par de que se puede utilizar corchetes si lo desea.Entonces %[email protected] there [email protected] es igualmente válido.

expresiones regulares

de Ruby

/[^A-Fa-f0-9]/ 

Los corchetes indican las clases de caracteres en las expresiones regulares de Ruby.

Encontré otro uso del [], como un patrón para usar en el método Dir :: glob, pero se supone que actúa exactamente como lo hace en las expresiones regulares. Aún así, indica que posiblemente hay más usos escondidos en los más de 1500 métodos de Ruby.

9

Los corchetes son en dos contextos estrictas y uno opcional uno:

Definición de Arrays
Arrays, es decir, una estructura de datos que proporciona y ordenó lista de elementos se puede especificar en código usando una sintaxis como [1,2,3]. Esto crea una matriz con los tres elementos 1, 2 y 3 en exactamente ese orden. puede iterar sobre la matriz usando las funciones del iterador como each o map o puede acceder directamente a elementos específicos por su id de índice como se muestra a continuación.

Acceso Elementos en Arrays y hashes
Hashes (también llamados HashMaps, diccionarios, o matrices asociativas en otros idiomas) también contienen elementos similares a arrays. Son diferentes de esto en la forma en que almacenan sus datos desordenado. No se accede a los datos mediante un ID entero, como es el caso de las matrices, sino con una clave arbitraria (comúnmente un símbolo o una cadena). Esto es diferente de, p. PHP donde se usa el mismo tipo de matriz para ambos.

Este acceso a los datos se ve facilitado por los métodos llamados [] y []= para hashes y matrices.

my_array = [:a, :b, :c] 
second_element = my_array[1] 
# => :b 
# notice that the first element in arrays always has the index 0 

my_hash = {:a => 1, :b => 2, :c => 3} 
element_of_b = my_hash[:b] 
# => 2 

Este es el caso de uso común para los soportes. En el código de Ruby, a veces puede ver otras clases implementando las funciones de corchetes. Lo hacen para permitir un acceso similar a matrices o hashes y, en general, se espera que estas clases se comporten de forma similar a las anteriores, pero esto no se aplica de ninguna manera. Vea también Duck Typing.

% Notación
Ruby tiene tercera sintaxis para crear cadenas (y otros objetos) aparte de la común. Usando esta sintaxis, la cadena literal en el código no está encerrada por " o ', sino que usa un delimitador especial.Se inicia con un signo de porcentaje, un único carácter que especifica el objeto que se ha creado y casi cualquier personaje para eligió como delimitador:

a = %w[foo bar baz] 
b = %w{foo bar baz} 
c = %wxfoo bar bazx 
d = ["foo", "bar", "baz"] 

Los tres ejemplo crear la misma matriz. Consulte algunos documentation sobre cómo usar esta sintaxis y qué otros caracteres de modificación están disponibles en Ruby.

Si bien es común utilizar los soportes aquí, de ninguna manera es necesario y puede sustituirse si es necesario. Es solo un aviso aquí ya que el uso más común de esta notación es crear una matriz de elementos a partir de una secuencia separada por espacios en blanco (como se ve arriba). Como tal, el uso de corchetes deja más claro que se devuelve una matriz ya que la sintaxis se parece a la especificación básica de la matriz.

+0

Y sí, sé que los hashes están ordenados en Ruby 1.9. Pero confiar demasiado en ese hecho será bastante sorprendente cuando se modifiquen los elementos y, en mi opinión, representa una violación de la estructura de datos. Me gusta mi hash desordenado :) –

+0

Thx mucho. Sin embargo, el objetivo principal de mi pregunta es obtener una lista completa de los usos de '[]' en lugar de una explicación de cada uso (aunque sería una buena ventaja). Quiero que alguien enumere los usos de '[]' y dígame "eso es todo lo que hay". ¿Hay muchos más usos, tal vez más de 10, o solo los que figuran en mis ejemplos en la pregunta original? (Acabo de enterarme de otro uso: la invocación de funciones anónimas, sean lo que sean). –

+2

Bueno, usted tiene los elementos de sintaxis que mencioné anteriormente. No hay más que esto. Sin embargo, muchas clases implementan los métodos '[]' donde significan cosas diferentes. No puede haber una lista exhaustiva para estos usos. Otro ejemplo es que la clase 'Proc' implementa el método' [] 'para significar llamar al proceso. Pero ese no es un nuevo uso, solo aplica el segundo método mencionado anteriormente. En general, todo lo que tiene que hacer es identificar uno de los patrones mencionados anteriormente. Si es el segundo, debe consultar la documentación para averiguar cuál es la semántica del método respectivo. –

Cuestiones relacionadas