2012-07-17 11 views
5
class MainController < ApplicationController 

    @my_var = 123 
    def index 
    var1 = @my_var 
    end 

    def index2 
    var2 = @my_var 
    end 
end 

Perché non è né var1 non var2 pari a 123?Rails e variabili di classe

risposta

22

Le variabili con @ sono variabili di istanza in ruby. Se stai cercando variabili di classe, hanno il prefisso @@, quindi dovresti utilizzare @@my_var = 123.

E il motivo per cui non è possibile utilizzare le variabili di istanza in questo modo, è perché se si definiscono le variabili di istanza all'esterno dei metodi, non vivono nello stesso ambito dei metodi, ma vivono solo mentre la classe viene interpretata.

var1 nell'esempio è una variabile locale, che sarà visibile solo all'interno del metodo index.

Esempi:

class Foo 
    @@class_variable = "I'm a class variable" 

    def initialize 
    @instance_variable = "I'm an instance variable in a Foo class" 
    local_variable = "I won't be visible outside this method" 
    end 

    def instance_method_returning_an_instance_variable 
    @instance_variable 
    end 

    def instance_method_returning_a_class_variable 
    @@class_variable 
    end 

    def self.class_method_returning_an_instance_variable 
    @instance_variable 
    end 

    def self.class_method_returning_a_class_variable 
    @@class_variable 
    end 
end 

Foo.new 
=> #<Foo:0x007fc365f1d8c8 @instance_variable="I'm an instance variable in a Foo class"> 
Foo.new.instance_method_returning_an_instance_variable 
=> "I'm an instance variable in a Foo class" 
Foo.new.instance_method_returning_a_class_variable 
=> "I'm a class variable" 
Foo.class_method_returning_an_instance_variable 
=> nil 
Foo.class_method_returning_a_class_variable 
=> "I'm a class variable" 
+0

Quindi qual è la differenza tra @var e var? – Alexandre

+2

'@ var' è una variabile di istanza, che sarà visibile in tutti i metodi in un'istanza della classe. 'var' è una variabile locale, che sarà visibile solo nell'ambito definito. – Frost

+0

Ok, qual è la differenza tra @var e @@ var? – Alexandre

0

Poiché il codice viene eseguito in un contesto diverso. Potete vedere qui:

class MainController 
    puts self 
    def print_self 
    puts self 
    end 
end 
#=> MainController 
MainController.new.print_self #=> <MainController:0x00000001761140> 

Come si può vedere nella prima stampa il sé è MainController, nella seconda stampa il sé è l'oggetto derivato da MainController classe.

Nell'assegnazione a @my_vay questa variabile appartiene a MainController e, nel secondo caso, il @my_var appartiene all'oggetto (non una classe) e questi valori sono diversi.

2

@my_var, nel codice di esempio, è una variabile di istanza sulla classe MainController. Cioè, è una variabile di istanza a livello di classe e non una variabile di istanza a livello di istanza. Esiste in un ambito completamente diverso rispetto alla variabile di istanza associata a un'istanza della classe.

All'interno del corpo dei vostri esempio metodi, index e index2, si sta tentando di dereference una variabile di istanza su un oggetto che è un'istanza della classe MainController, ma non hanno definito che variabile di istanza da nessuna parte, in modo da ottenere indietro nil.

Se si desidera utilizzare @my_var come variabile di istanza a livello di classe, si può ottenere il suo valore all'interno di un'istanza della classe come questa:

var1 = self.class.instance_variable_get(:@my_var) 

variabili di classe sono indicati con un prefisso @@, e il loro uso non è completamente incoraggiato. Un paio di minuti con Google ti dirà perché.

Problemi correlati