class MainController < ApplicationController
@my_var = 123
def index
var1 = @my_var
end
def index2
var2 = @my_var
end
end
どちらもと等しくvar1
ないのはなぜですか?var2
123
class MainController < ApplicationController
@my_var = 123
def index
var1 = @my_var
end
def index2
var2 = @my_var
end
end
どちらもと等しくvar1
ないのはなぜですか?var2
123
の変数@
は、rubyのインスタンス変数です。クラス変数を探している場合は、接頭辞としてが付いている@@
ため、代わりにを使用する必要があります@@my_var = 123
。
また、インスタンス変数をそのように使用できない理由は、メソッドの外部でインスタンス変数を定義した場合、それらはメソッドと同じスコープに存在せず、クラスが解釈されている間のみ存在するためです。
var1
index
あなたの例ではローカル変数であり、メソッド内でのみ表示されます。
例:
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"
@my_var
サンプルコードの は、クラス のインスタンス変数ですMainController
。つまり、インスタンス レベルのインスタンス変数ではなく、クラス レベルのインスタンス変数です。クラスのインスタンスに関連付けられたインスタンス変数とはまったく異なるスコープに存在します。
インスタンスメソッドの本体内で、クラス のインスタンスであるオブジェクトのインスタンス変数を逆参照しようとしてindex
いますが、そのインスタンス変数をどこにも定義していないため、 が返されます。index2
MainController
nil
クラス レベルのインスタンス変数として使用@my_var
する場合は、次のようにクラスのインスタンス内から値を取得できます。
var1 = self.class.instance_variable_get(:@my_var)
クラス変数は@@
接頭辞で示され、その使用が完全に推奨されるわけではありません。その理由は、Google で数分調べればわかります。
コードは異なるコンテキストで実行されるためです。ここで見ることができます:
class MainController
puts self
def print_self
puts self
end
end
#=> MainController
MainController.new.print_self #=> <MainController:0x00000001761140>
最初の印刷でわかるように、自己はです。2番目の印刷では、自己はクラスMainController
から派生したオブジェクトです。MainController
@my_vay への割り当てでは、この変数は MainController に属し、2 番目のケースでは、@my_var はオブジェクト (クラスではない) に属し、これらの変数は異なります。