2008-08-15 18 views

Respuesta

63

Depende del contexto:

  1. 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 
    
  2. [] 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.

  3. 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 
    
+2

secundarios nota: Hash # traen no es exactamente Hash # []. {: a => 1,: b => 2} .fetch (: c) IndexError: clave no encontrada – tokland

+0

@tokland ': c' no encontrada – YoYoYonnY

+0

" 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

9

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

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 
+0

lambda {1 + 2} [] # => 3 –

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" 
19

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"] 
+0

¡Nunca lo sabía, gracias! – Tilendor

2

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 
+0

¿Cuál es el '@ rank'? – FeifanZ

Cuestiones relacionadas