実験として、私は次のようなコードを書きました
class MyClass
@var = 100
def hello
p "hello"
end
end
私がそうするなら、それはそのオブジェクトで定義されていないMyClass.new
ことを私は知っています、むしろこれはクラスで@var
定義されると思います。@var
MyClass
これの実用的な使い方はありますか?
それには用途があります:クラス変数。通常のRubyクラス変数の実装は@@
、スーパークラスとそのサブクラスの間で同じ変数を共有します。
class A
@@v = 0
def self.v; @@v; end
def self.v=(val); @@v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v #->3
B.v= 42 #-> 42
A.v #-> 42
明らかに、これはかなり役に立たない(クラスインスタンス変数とは異なり、クラス変数は、を介してではなく、インスタンスメソッドで直接アクセスできるという事実を除いてself.class
)。しかし、クラスインスタンス変数を使用した同じ例:
class A
@v = 0
def self.v; @v; end
def self.v=(val); @v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v= 42 #-> 42
A.v #-> 3
また、クラスインスタンス変数は、次のように、インスタンス変数用にすでに記述されているすべてのメタプログラミングを利用できます。
class Foo
class << self
attr_accessor :v #Uses a class instance variable
end
end
アクセサメソッドを作成する場合@var
MyClass.singleton_class.class_eval { attr_accessor :var }
@var
そうすれば、クラス変数のように扱うことができます。違いは、のサブクラスには継承されないことですMyClass
。
_whyはDwemthyの配列でこれを利用します。