2

実験として、私は次のようなコードを書きました

class MyClass

    @var = 100

    def hello
      p "hello"
    end

end

私がそうするなら、それはそのオブジェクトで定義されていないMyClass.newことを私は知っています、むしろこれはクラスで@var定義されると思います。@varMyClass

これの実用的な使い方はありますか?

4

2 に答える 2

7

それに用途があります:クラス変数。通常の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
于 2012-07-22T02:10:13.463 に答える
1

アクセサメソッドを作成する場合@var

MyClass.singleton_class.class_eval { attr_accessor :var }

@varそうすれば、クラス変数のように扱うことができます。違いは、のサブクラスには継承されないことですMyClass

_whyはDwemthyの配列でこれを利用します。

于 2012-07-22T01:45:35.483 に答える