2010-08-21 21 views

Respuesta

18

OK.

La diferencia entre los operadores = y => es que la primera es la asignación, la segunda representa una asociación en un hash (matriz asociativa). Por lo tanto, { :key => 'val' } dice "crear una matriz asociativa, con :key siendo la clave y 'val' siendo el valor". Si quieres sonar como un Rubyist, llamamos a esto "hashrocket". (Créalo o no, este no es el operador más extraño en Ruby, también tenemos el <=>, o "operador de nave espacial").

Puede estar confundido porque hay un atajo corto que puede usar en métodos, si el último parámetro es un hash, puede omitir los corchetes ondulados ({}). así que llamar al render :partial => 'foo' es básicamente llamar al método de renderizado, pasando un hash con un par clave/valor único. Debido a esto, a menudo se ve un hash como el último parámetro para tener los parámetros opcionales de un pobre (también se ve algo similar en JavaScript).

En Ruby, cualquier palabra normal es una variable local. Entonces foo dentro de un método es una variable con alcance al nivel del método. Prefijar una variable con @ significa abarcar la variable a la instancia. Entonces, @foo en un método es un nivel de instancia.

@@ significa una variable de clase, lo que significa que las variables @@ están dentro del alcance de la clase y de todas las instancias.

: significa símbolo. Un símbolo en Ruby es un tipo especial de cadena que implica que se usará como clave. Si proviene de C#/Java, son similares en el uso a la parte clave de una enumeración. También existen algunas otras diferencias, pero básicamente cada vez que va a tratar una cadena como cualquier tipo de clave, en su lugar usa un símbolo.

14

Guau, eso es una gran cantidad de conceptos diferentes juntos.

1) = es asignación simple.

a = 4; 
puts a 

2) => se utiliza para declarar los hashes

hash = {'a' => 1, 'b' => 2, 'c' => 3} 
puts hash['b'] # prints 2 

3) @var le permite acceder a la variable de instancia de objeto.

class MyObject 
    def set_x(x) 
     @x = x 
    end 
    def get_x 
     @x 
    end 
end 

o = MyObject.new 
o.set_x 3 
puts o.get_x # prints 3 

4) @@var le permite acceder a las variables de clase ('estáticos').

class MyObject 
    def set_x(x) 
     @@x = x # now you can access '@@x' from other MyObject instance 
    end 
    def get_x 
     @@x 
    end 
end 

o1 = MyObject.new 
o1.set_x 3 
o2 = MyObject.new 
puts o2.get_x # prints 3, even though 'set_x' was invoked on different object 

5) Pienso generalmente de :var 'etiqueta' clase tan especial. El ejemplo 2 se puede reformular así

hash = {:a => 1, :b => 2, :c => 3} 
puts hash[:b] # prints 2 
+0

los ejemplos 3 y 4 me resultan confusos, no puedo ver la diferencia en el ejemplo 3 y 4. –

+0

@Simon Ejecute el ejemplo # 4 con @x en lugar de @@ x y verá la diferencia –

Cuestiones relacionadas