En Ruby, ¿cuál es la diferencia entre {}
y []
?¿Qué significan los diferentes corchetes en Ruby?
{}
parece ser utilizado para bloques de código y hash.
¿Están []
solo para matrices?
La documentación no está muy clara.
En Ruby, ¿cuál es la diferencia entre {}
y []
?¿Qué significan los diferentes corchetes en Ruby?
{}
parece ser utilizado para bloques de código y hash.
¿Están []
solo para matrices?
La documentación no está muy clara.
Depende del contexto:
Cuando por su cuenta , o asignar a una variable, []
crea un rrays, y {}
crea hashes. p.ej.
a = [1,2,3] # an array
b = {1 => 2} # a hash
[]
Se pueden anular como un método personalizado, y generalmente es usado para obtener las cosas desde hashes (los conjuntos de bibliotecas estándar de hasta []
como un método en hashes que es el mismo que fetch
)
Hay también una convención de que se usa como un método de clase de la misma manera que 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
Ver el Rubí Hash docs para ese último ejemplo.
Este es probablemente el más complicado uno - {}
es también la sintaxis para los bloques, pero sólo cuando se pasa a un método fuera del parens argumentos.
Cuando se invoca métodos sin parens, Ruby mira donde pones las comas para averiguar dónde está el final argumentos (donde habrían sido los parens, tuvo que se hayan 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, estás en lo cierto. Además de hash, el estilo general es que las llaves 1/se usan a menudo para bloques que pueden caber en una 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. Por lo tanto:
Hash["key" => "value"]
es tan válido como:
{ "key" => "value" }
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
lambda {1 + 2} [] # => 3 –
El corchetes [] se utilizan para inicializar matrices. La documentación para el caso de inicialización de [] está en
ri Array::[]
Las llaves {} se utiliza para inicializar los hashes. La documentación para el caso del inicializador de {} está en
ri Hash::[]
Los corchetes se utilizan también comúnmente como un método en muchas clases de rubí de núcleo, como Array, Hash, String, y otros.
Puede acceder a una lista de todas las clases que tienen método "[]" definidos con
ri []
la mayoría de los métodos también tienen 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 usar en lugar de "do ... end" en bloques, como "{...}".
Otro caso en el que se puede ver entre corchetes o entre llaves utilizadas - está en los inicializadores especiales donde cualquier símbolo se puede utilizar, 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"
Otra, no tan obvio, el uso de []
es como una sinónimo para 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.
E.g.
proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)
proc["World"]
meth["Hello",","," ", "World!", "\n"]
¡Nunca lo sabía, gracias! – Tilendor
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
¿Cuál es el '@ rank'? – FeifanZ
secundarios nota: Hash # traen no es exactamente Hash # []. {: a => 1,: b => 2} .fetch (: c) IndexError: clave no encontrada – tokland
@tokland ': c' no encontrada – YoYoYonnY
" También existe la convención de que se usa como método de clase en el De la misma manera que puede usar un método de creación estático en C# o Java ". Esta es exactamente la respuesta que estaba buscando. También es un ejemplo clásico de lo que más odio de Ruby; tienes que saber toneladas de pequeños trucos oscuros para leer el código de Ruby. – Tony