2010-08-21 12 views

risposta

18

OK.

La differenza tra gli operatori = e => è che il primo è l'assegnazione, il secondo rappresenta un'associazione in un hash (array associativo). Quindi { :key => 'val' } sta dicendo "creare un array associativo, con :key come chiave e 'val' come valore". Se vuoi sembrare un Rubyist, lo chiamiamo "hashrocket". (Che ci crediate o meno, questo non è l'operatore più strano in Ruby, abbiamo anche il <=>, o "operatore astronave".)

Potresti essere confuso perché c'è un po 'di scorciatoia che puoi usare in metodi, se l'ultimo parametro è un hash, puoi omettere le parentesi ondulate ({}). quindi chiamare render :partial => 'foo' fondamentalmente chiama il metodo render, passando un hash con una singola coppia chiave/valore. Per questo motivo, si vede spesso un hash come ultimo parametro per ordinare i parametri facoltativi di un uomo povero (si vede qualcosa di simile fatto anche in JavaScript).

In Ruby, qualsiasi parola normale è una variabile locale. Pertanto, foo all'interno di un metodo è una variabile con ambito al livello del metodo. Il prefisso di una variabile con @ indica l'ambito della variabile sull'istanza. Quindi, @foo in un metodo è un livello di istanza.

@@ significa una variabile di classe, ovvero le variabili @@ rientrano nell'ambito della classe e tutte le istanze.

: significa simbolo. Un simbolo in Ruby è un tipo speciale di stringa che implica che verrà utilizzato come chiave. Se provieni da C#/Java, sono simili in uso alla parte fondamentale di un enum. Ci sono anche altre differenze, ma in pratica ogni volta che si tratta una stringa come qualsiasi tipo di chiave, si usa invece un simbolo.

14

Wow, un sacco di concetti diversi insieme.

1) = è un compito semplice.

a = 4; 
puts a 

2) => consente di dichiarare hash

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

3) @var consente di accedere variabile di istanza di oggetto.

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 consente di accedere classe) variabili ('statici'.

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) Io di solito penso a :var come speciale 'label' di classe. L'esempio 2 può essere riformulato in questo modo

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

esempio 3 e 4 sono confusi per me, non riesco a vedere la differenza nell'esempio 3 e 4. –

+0

@Simon Esegui l'esempio # 4 con @x anziché @@ x e vedrai la differenza –