Pregunta

En Ruby, ¿cuál es la diferencia entre {} y []?

{} parece ser utilizado para ambos bloques de código y hash.

Son [] sólo para matrices?

La documentación no es muy clara.

¿Fue útil?

Solución

Depende del contexto:

  1. Cuando en sus el propios, o asignar a una variable, [] crea matrices, y {} crea hashes.por ejemplo,

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] puede ser reemplazado como un método personalizado, y se utiliza generalmente para buscar cosas de hashes (la biblioteca estándar establece [] como un método de hash que es el mismo que fetch)
    También hay una convención que se utiliza como un método de clase en la misma forma en que se podría utilizar un static Create método en C# o Java.por ejemplo,

    a = {1 => 2} # create a hash for example
    puts a[1] # same as a.fetch(1), will print 2
    
    Hash[1,2,3,4] # this is a custom class method which creates a new hash
    

    Ver el Rubí Hash docs para el último ejemplo.

  3. Este es probablemente el más complicado - {} también es la sintaxis para los bloques, pero sólo cuando se pasa a un método FUERA de los argumentos paréntesis.

    Cuando la invocación de métodos sin paréntesis, Ruby mira donde poner las comas para averiguar donde los argumentos final (donde el paréntesis hubiera sido, de haber escrito)

    1.upto(2) { puts 'hello' } # it's a block
    1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
    1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
    

Otros consejos

Otro, no es tan obvio, el uso de [] es como un sinónimo de la Proc#llame y Método#llamada.Esto puede ser un poco confuso la primera vez que lo encuentran.Supongo que el racional detrás de esto es que hace que se vea más como una función normal de la llamada.

E. g.

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

En términos generales, usted está en lo correcto.Así como hash, el estilo general es que las llaves {} se utiliza a menudo para los bloques de los que caben todas en una línea, en lugar de utilizar do/end a través de varias líneas.

Entre corchetes [] se utilizan como métodos de la clase en un montón de Ruby, incluyendo los cursos de Cadena, BigNum, Dir y confusamente suficiente, Hash.Así:

Hash["key" => "value"]

es tan válido como:

{ "key" => "value" }

Los corchetes [ ] se utilizan para inicializar las matrices.La documentación de inicializador caso de [ ] es en

ri Array::[]

Las llaves { } se usan para inicializar los hashes.La documentación de inicializador caso de { } es en

ri Hash::[]

Los corchetes se utilizan comúnmente como un método en muchos núcleo ruby clases, como Matriz, Hash de la Cadena, y otros.

Usted puede acceder a una lista de todas las clases que tienen el método de "[ ]" que se define con

ri []

la mayoría de los métodos tienen también un "[ ]=" método que permite asignar las cosas, por ejemplo:

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

Las llaves también se pueden utilizar en lugar de "hacer ...final" en bloques, como "{ ...}".

Otro caso en el que se puede ver entre corchetes o llaves usadas - es en el especial de inicializadores donde cualquier símbolo puede ser utilizado, como por ejemplo:

%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"

un par de ejemplos:

[1, 2, 3].class
# => Array

[1, 2, 3][1]
# => 2

{ 1 => 2, 3 => 4 }.class
# => Hash

{ 1 => 2, 3 => 4 }[3]
# => 4

{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash

lambda { 1 + 2 }.class
# => Proc

lambda { 1 + 2 }.call
# => 3

Tenga en cuenta que puede definir el [] método para sus propias clases:

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top