¿Qué significan los diferentes corchetes en Ruby?


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

{} parece ser usado tanto para bloques de código como para hashes.

¿Son [] solo para matrices?

La documentación no es muy clara.

 78
Author: the Tin Man, 2008-08-15

6 answers

, depende del contexto:

  1. Cuando por su cuenta, o asignando a una variable, [] crea arrays, y {} crea hashes. por ejemplo,

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] se puede sobrescribir como un método personalizado, y generalmente se usa para obtener cosas de hashes (la biblioteca estándar establece [] como un método en hashes que es el mismo que fetch)
    También hay una convención que se utiliza como un método de clase de la misma manera que se puede utilizar un método static Create 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
    

    Vea el Ruby Hash docs para este último ejemplo.

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

    Cuando invoca métodos sin paréntesis, Ruby observa dónde pone las comas para averiguar dónde terminan los argumentos (dónde habrían estado los paréntesis, si los hubiera 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
    
 67
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 05:34:45

Otro uso, no tan obvio, de [] es como sinónimo de Proc#call y Method#call. Esto puede ser un poco confuso la primera vez que lo encuentres. Supongo que la razón detrás de esto es que hace que se vea más como una llamada a una función normal.

Por ejemplo

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
 19
Author: sris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 05:36:16

En términos generales, tienes razón. Además de los hashes, el estilo general es que las llaves {} se usan a menudo para bloques que pueden caber todos en una línea, en lugar de usar do/end a través de varias líneas.

Los corchetes [] se usan como métodos de clase en muchas clases Ruby, incluyendo String, BigNum, Dir y confusingly enough, Hash. Entonces:

Hash["key" => "value"]

Es tan válido como:

{ "key" => "value" }
 9
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 05:42:31

Los corchetes [ ] se utilizan para inicializar matrices. La documentación para el caso inicializador de [] está en

ri Array::[]

Los corchetes { } se utilizan para inicializar los hashes. La documentación para el caso del inicializador de { } está en

ri Hash::[]

Los corchetes también se usan comúnmente como método en muchas clases principales de ruby, como Array, Hash, String y otras.

Puede acceder a una lista de todas las clases que tienen el método "[ ]" definido con

ri []

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

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

Los corchetes también se pueden usar en lugar de "do ... terminar "en bloques, como" {... }".

Otro caso en el que se pueden ver corchetes o corchetes usados-es en los inicializadores especiales donde se puede usar cualquier símbolo, como:

%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"
 3
Author: Evgeny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 07:52:50

Algunos 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
 2
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-15 19:03:12

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
 2
Author: rogerdpack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 05:35:45