2010-08-21 6 views

Répondre

18

OK. La différence entre les opérateurs = et => est que la première est une affectation, la seconde représente une association dans un hachage (tableau associatif). Donc, { :key => 'val' } dit "créer un tableau associatif, avec :key étant la clé, et 'val' étant la valeur". Si vous voulez ressembler à un Rubyist, nous appelons cela le "hashrocket". (Croyez-le ou non, ce n'est pas l'opérateur le plus étrange de Ruby, nous avons aussi le <=>, ou "opérateur de vaisseau spatial".)

Vous pouvez être dérouté car il y a un peu de raccourci que vous pouvez utiliser dans méthodes, si le dernier paramètre est un hachage, vous pouvez omettre les accolades ({}). l'appel render :partial => 'foo' appelle donc fondamentalement la méthode render, en passant un hachage avec une seule paire clé/valeur. Pour cette raison, vous voyez souvent un hachage comme le dernier paramètre à trier les paramètres facultatifs d'un pauvre (vous voyez quelque chose de similaire fait en JavaScript aussi).

Dans Ruby, tout mot normal est une variable locale. Donc foo à l'intérieur d'une méthode est une variable portée au niveau de la méthode. Le préfixage d'une variable avec @ signifie que la variable est étendue à l'instance. Donc @foo dans une méthode est un niveau d'instance.

@@ signifie une variable de classe, ce qui signifie que les variables @@ sont dans la portée de la classe et toutes les instances.

: signifie symbole. Un symbole dans Ruby est un type spécial de chaîne qui implique qu'il sera utilisé comme une clé. Si vous venez de C#/Java, ils sont similaires à la partie clé d'une énumération. Il existe également d'autres différences, mais chaque fois que vous allez traiter une chaîne comme une sorte de clé, vous utilisez un symbole à la place.

14

Wow, c'est un ensemble de concepts différents.

1) = est une ancienne affectation simple.

a = 4; 
puts a 

2) => permet de déclarer hash

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

3) @var vous permet d'accéder à la variable d'instance d'objet.

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 vous permet d'accéder à des variables de classe ('statiques').

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) Je pense généralement :var comme classe spéciale 'label'. L'exemple 2 peut être reformulé comme ceci

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

Les exemples 3 et 4 sont confus pour moi, je ne vois pas de différence dans les exemples 3 et 4. –

+0

@Simon Exécutez l'exemple # 4 avec @x au lieu de @@ x et vous verrez la différence –

Questions connexes