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
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
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"
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.
@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é.
Quindi qual è la differenza tra @var e var? – Alexandre
'@ 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
Ok, qual è la differenza tra @var e @@ var? – Alexandre