Pregunta ¿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 hash.

Son [] solo para matrices?

La documentación no es muy clara.


76
2017-08-15 18:09


origen


Respuestas:


Depende del contexto:

  1. Cuando están solos, o asignados a una variable, [] crea arreglos, y {} crea hashes. p.ej.

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] se puede anular como un método personalizado, y generalmente se usa para recuperar cosas de hash (la biblioteca estándar configura [] como un método en hashes que es lo mismo que fetch)
    También existe la convención de que se usa como método de clase de la misma manera que se puede usar un static Create método en C # o Java. p.ej.

    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 Ruby Hash docs para ese último ejemplo.

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

    Cuando invocas métodos sin parens, Ruby mira dónde colocas las comas para averiguar dónde terminan los argumentos (dónde habrían estado los parens, si los hubieras 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
2017-08-17 21:17



Otro uso no tan obvio de [] es como un sinónimo de Proc # call y Method # call. Esto podría ser un poco confuso la primera vez que lo encuentre. Creo que lo racional detrás de esto es que lo hace ver más como una llamada a función normal.

P.ej.

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

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

19
2018-04-02 15:47



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

Corchetes [] se usan como métodos de clase en muchas clases de Ruby, incluyendo String, BigNum, Dir y lo suficientemente confuso, Hash. Asi que:

Hash["key" => "value"]

es tan válido como:

{ "key" => "value" }

9
2017-08-15 18:24



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

ri Array::[]

Los corchetes {} se usan 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 básicas de ruby, como Array, Hash, String y otros.

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 tienen 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 ... end" en los bloques, como "{...}".

Otro caso en el que puede ver corchetes o llaves usadas 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
2017-09-17 07:52



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
2017-08-15 19:03



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
2017-10-13 21:47