¿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.
6 answers
, depende del contexto:
-
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
-
[]
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 quefetch
)
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étodostatic 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.
-
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
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"]
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" }
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"
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
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
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