sintax rails escape ruby syntax

rails - ¿Qué significan los diferentes corchetes en Ruby?



haml to html (6)

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

{} parece usarse tanto para bloques de código como para hash.

¿Son [] solo para matrices?

La documentación no es muy clara.


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


Depende del contexto:

  1. Cuando están solos o asignando una variable, [] crea matrices 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 obtener cosas de hashes (la biblioteca estándar establece [] como un método en hash, 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 método static Create 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

    Vea los documentos de Ruby Hash para el último ejemplo.

  3. Este es probablemente el más complicado - {} también es una 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


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

Los 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" }


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"


Otro, no tan obvio, el uso de [] es como sinónimo de Llamada de Proc # y Llamada de Método #. 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"]


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