2010-08-21 12 views

Antwort

18

OK umformuliert werden.

Der Unterschied zwischen den Operatoren = und => ist, dass die erste Zuweisung ist, die zweite eine Assoziation in einem Hash (assoziative Array) darstellt. So { :key => 'val' } sagt „erstellen Sie ein assoziatives Array, mit :key der Schlüssel zu sein, und 'val' wobei der Wert“. Wenn Sie wie ein Rubyist klingen wollen, nennen wir das "hashrocket". (Ob Sie es glauben oder nicht, das ist nicht der seltsamste Operator in Ruby; wir haben auch die <=>, oder "Raumschiff-Operator".)

Sie können verwirrt sein, weil es ein bisschen eine Abkürzung gibt, in der Sie verwenden können Methoden, wenn der letzte Parameter ein Hash ist, können Sie die Squiggly-Klammern ({}) weglassen. Das Aufrufen von render :partial => 'foo' ruft im Grunde die Rendermethode auf und übergibt einen Hash mit einem einzelnen Schlüssel/Wert-Paar. Aus diesem Grund sehen Sie oft einen Hash als letzten Parameter, der die optionalen Parameter eines armen Mannes enthält (Sie sehen etwas Ähnliches auch in JavaScript).

In Ruby, jedes normales Wort ist eine lokale Variable. So ist foo innerhalb einer Methode eine Variable, die auf die Methodenebene beschränkt ist. Das Vorfixieren einer Variablen mit @ bedeutet, dass die Variable auf die Instanz beschränkt ist. So ist @foo in einer Methode eine Instanzenebene.

@@ bedeutet eine Klassenvariable, was bedeutet, dass @@ Variablen im Bereich der Klasse und alle Instanzen sind.

: bedeutet Symbol. Ein Symbol in Ruby ist eine spezielle Art von String, die impliziert, dass es als Schlüssel verwendet wird. Wenn Sie aus C#/Java kommen, sind sie ähnlich dem Schlüsselteil einer Enumeration. Es gibt auch einige andere Unterschiede, aber grundsätzlich, wenn Sie eine Zeichenfolge als eine Art von Schlüssel behandeln, verwenden Sie stattdessen ein Symbol.

14

Wow, ein, die zusammen eine Menge verschiedenen Konzepte ist.

1) = ist plain old Zuordnung.

a = 4; 
puts a 

2) => verwendet Hashes zu erklären

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

3) @var können Sie Objektinstanz Variable zugreifen.

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 können Sie Klasse ('statische') Variablen zugreifen.

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) Ich denke, in der Regel von :var als Sonder 'label' Klasse. Beispiel 2 kann wie dieser

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

Beispiel 3 und 4 sind verwirrend für mich, ich kann keinen Unterschied in Beispiel 3 und 4 sehen. –

+0

@Simon Führen Sie das Beispiel # 4 mit @x statt @@ x und Sie werden den Unterschied sehen –

Verwandte Themen