@ Variablen in Ruby on Rails

294

Was ist der Unterschied zwischen @titleund title? Da beide Variablennamen sein können. Wie entscheide ich, welche Art von Variable ich verwenden soll? Mit @oder nicht?

Eine Null
quelle
Ich würde sagen, dieses Tutorial ist ziemlich ordentlich, um all dies zu erklären: techotopia.com/index.php/…
Hearen

Antworten:

426

titleist eine lokale Variable. Sie existieren nur in ihrem Geltungsbereich (aktueller Block)

@title ist eine Instanzvariable - und steht allen Methoden innerhalb der Klasse zur Verfügung.

Weitere Informationen finden Sie hier: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Wenn Sie in Ruby on Rails Ihre Variablen in Ihrem Controller als Instanzvariablen ( @title) deklarieren , stehen sie Ihrer Ansicht zur Verfügung.

Peter Rasmussen
quelle
4
Vielen Dank für die Antwort, haben Sie eine Folgefrage ... Innerhalb einer Klasse, an der ich arbeite, ist die Mitgliedsvariable zunächst wie @options = {...} aufgebaut. Danach greifen Methoden innerhalb der Klasse auf diese Funktion zu und führen Funktionsaufrufe mit dieser Variablen durch, als wäre sie lokal (dh "options.merge ()"). Ist das nur eine schlechte Form? Gibt es noch eine andere syntaktische Magie? (dh wie ein stilles Dup der Variablen oder ein 'const', damit es nicht geändert werden kann usw.)? Ich komme aus einer C / C ++ & Java-Perspektive und die wirklich vage und optionale Syntax macht mich verrückt!
Dan Devine
Hat Ihre Klasse einen attr_accessor mit dem gleichen Namen @DanDevine definiert? attr_accessor ist syntaktischer Zucker, der einen Getter \ Setter für Sie generiert. Wenn Sie den Wert ohne das @ -Symbol erhalten, empfängt der Code die Variable, weil er den Getter aufruft. Beachten Sie, dass dies nicht anders funktioniert. Sie müssen das @ -Symbol explizit verwenden, wenn Sie die Variable festlegen, oder Sie legen nur eine lokale Variable fest. Ist das ein guter Stil? Schwer zu sagen. Ich bevorzuge es, die Getter-Syntax in meinen Methoden zu verwenden, falls der Getter überschrieben wird - ich respektiere diese Kapselung gerne, auch innerhalb der Klasse selbst. YMMV
Msencenb
30

Verwenden @titleSie diese Option in Ihren Controllern, wenn Ihre Variable in Ihren Ansichten verfügbar sein soll.

Die Erklärung ist, dass @titlees sich um eine Instanzvariable und titleeine lokale Variable handelt und Rails Instanzvariablen von Controllern für Ansichten verfügbar macht. Dies liegt daran, dass der Vorlagencode (erb, haml usw.) im Bereich der aktuellen Controller-Instanz ausgeführt wird.

joscas
quelle
Danke dafür! Dies ist die einzige Antwort, die erklärt, warum in der Controller-Klasse definierte @ -Variablen durch Code in den Ansichten erfasst werden können.
AlexC
25

Der Unterschied liegt im Umfang der Variablen. Die @ -Version steht allen Methoden der Klasseninstanz zur Verfügung.

Die kurze Antwort: Wenn Sie sich im Controller befinden und die Variable für die Ansicht verfügbar machen müssen, verwenden Sie @variable.

Versuchen Sie für eine viel längere Antwort Folgendes: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

APS
quelle
14

@variables werden in Ruby als Instanzvariablen bezeichnet. Dies bedeutet, dass Sie in JEDER METHODE innerhalb der Klasse auf diese Variablen zugreifen können. [Über alle Methoden in der Klasse hinweg]

Variablen ohne das @Symbol werden als lokale Variablen bezeichnet. Dies bedeutet, dass Sie nur innerhalb DIESER ERKLÄRTEN METHODE auf diese lokalen Variablen zugreifen können. Beschränkt auf den lokalen Bereich.

Beispiel für Instanzvariablen:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

In dem obigen Beispiel @cust_id, @cust_name, @cust_addrwerden in einem anderen Verfahren in der Klasse zugegriffen. Das Gleiche wäre jedoch mit lokalen Variablen nicht möglich.

Prabhakar Undurthi
quelle
9

Ein Tutorial über Was ist variabler Umfang? präsentiert einige Details ganz gut, fügen Sie einfach die verwandten hier.


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+
Gehört
quelle
4

Auf eine lokale Variable kann nur innerhalb des Blocks ihrer Initialisierung zugegriffen werden. Auch eine lokale Variable beginnt mit einem Kleinbuchstaben (az) oder einem Unterstrich (_).

Und Instanzvariable ist eine Instanz von selfund beginnt mit einer @Auch eine Instanzvariable gehört zum Objekt selbst. Instanzvariablen sind diejenigen , die Sie Methoden auf , dh durchführen .sendusw.

Beispiel:

@user = User.all

Das @userist die Instanzvariable

Und nicht initialisierte Instanzvariablen haben den Wert von Nil

Joe Hilton
quelle
Wie erklärt dies den Unterschied zwischen @title& title?
Richard Peck
Mit einer Instanzvariablen wie @title können Sie verschiedene Methoden ausführen, während eine lokale Variable dies nicht tut
Joe Hilton
1
Wie behebt das die Frage? Sieht so aus, als würden Sie nur ein Tutorial zitieren. Das OP will wissen, ob er verwenden soll @titleodertitle
Richard Peck
Sie sollten also eine Instanzvariable verwenden, wenn sie Methoden ausführen möchten, z. B. def new oder def create usw.
Joe Hilton,
3
Nichts hindert Sie daran, user = User.all auszuführen und Methoden für user auszuführen, aber das ist nicht der Punkt.
Jaro