@ variabili in Ruby on Rails


294

Qual è la differenza tra @titlee title? Dal momento che entrambi possono essere nomi di variabili. Inoltre, come posso decidere quale tipo di variabile dovrei usare? Con @o no?


Direi che questo tutorial è abbastanza accurato per spiegare tutto questo: techotopia.com/index.php/…
Hearen

Risposte:


427

titleè una variabile locale. Esistono solo nel suo ambito (blocco corrente)

@title è una variabile di istanza ed è disponibile per tutti i metodi all'interno della classe.

Puoi leggere di più qui: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

In Ruby on Rails: dichiarare le variabili nel controller come variabili di istanza ( @title) le rende disponibili per la visualizzazione.


4
Grazie per la risposta, fai una domanda di follow-up ... All'interno di una classe su cui sto lavorando, la variabile membro è inizialmente costruita come @options = {...}. Dopodiché, tuttavia, i metodi all'interno della classe accedono ed effettuano chiamate di funzione con quella variabile come se fosse locale (cioè "options.merge ()"). Questa è solo una cattiva forma? C'è qualche altra magia sintattica in corso? (ad es. come rendere silenzioso il duplicato della variabile o renderlo "const" in modo che non possa essere modificato, ecc.)? Vengo da una prospettiva C / C ++ e Java, e la sintassi davvero vaga e facoltativa mi sta facendo impazzire!
Dan Devine,

La tua classe ha un attr_accessor definito con lo stesso nome @DanDevine? attr_accessor è lo zucchero sintattico che genera un getter \ setter per te. Se stai ottenendo il valore senza il simbolo @, il codice riceve la variabile perché sta chiamando il getter. Nota che non funziona diversamente, devi usare esplicitamente il simbolo @ se stai impostando var, altrimenti imposterai semplicemente una var locale. Questo è un buon stile? Difficile da dire. Preferisco usare la sintassi getter nei miei metodi nel caso in cui il getter sia annullato - mi piace rispettare quell'incapsulamento, anche all'interno della classe stessa. YMMV
Msencenb

30

Utilizzare @titlenei controller quando si desidera che la variabile sia disponibile nelle visualizzazioni.

La spiegazione è che si @titletratta di una variabile di istanza ed titleè una variabile locale e le rotaie rendono le variabili di istanza dai controller disponibili alle viste. Ciò accade perché il codice modello (erb, haml, ecc.) Viene eseguito nell'ambito dell'istanza del controller corrente.


Grazie per questo! Questa è l'unica risposta che spiega perché @variables definito nella classe controller può essere raccolto per codice nelle viste.
AlexC,


14

@variables sono chiamati variabili di istanza in ruby. Ciò significa che puoi accedere a queste variabili in QUALSIASI METODO all'interno della classe. [Attraverso tutti i metodi della classe]

Le variabili senza il @simbolo sono chiamate variabili locali, il che significa che è possibile accedere a tali variabili locali solo all'interno di QUESTO METODO DICHIARATO. Limitato all'ambito locale.

Esempio di variabili di istanza:

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

Nell'esempio sopra @cust_id, @cust_name, @cust_addrsono accessibili in un altro metodo all'interno della classe. Ma la stessa cosa non sarebbe accessibile con le variabili locali.


10

Un tutorial su Cos'è l'ambito variabile? presenta alcuni dettagli abbastanza bene, basta allegare i relativi qui.


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

4

Una variabile locale è accessibile solo all'interno del blocco della sua inizializzazione. Anche una variabile locale inizia con una lettera minuscola (az) o un trattino basso (_).

E la variabile di istanza è un'istanza di selfe inizia con una @Anche una variabile di istanza appartiene all'oggetto stesso. Le variabili di istanza sono quelle su cui si eseguono i metodi, ad es. .sendEcc

esempio:

@user = User.all

La @userè la variabile di istanza

E le variabili di istanza non inizializzate hanno un valore di Nil


In che modo questo spiega la differenza tra @title& title?
Richard Peck,

Con una variabile di istanza come @title puoi eseguire vari metodi su di essa, mentre una variabile locale non lo fai
Joe Hilton

1
Quindi come risolve effettivamente la domanda? Sembra che tu stia solo citando un tutorial. L'OP vuole sapere se dovrebbe usare @titleotitle
Richard Peck il

Quindi dovrebbero usare una variabile di istanza se vogliono eseguire qualsiasi metodo, ovvero def new o def create etc
Joe Hilton

3
Nulla ti impedisce di fare user = User.all ed eseguire metodi sull'utente, ma non è questo il punto.
Jaro,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.