7

そのクラスでインスタンス化されたオブジェクトの総数などを追跡するためにクラス変数が必要な理由は理解できます。

また、特定のオブジェクトの属性をそのクラスに格納するためにインスタンス変数が必要な理由も理解できます。

しかし、クラスのインスタンス変数は正当化できないようです。

私が理解しているように、クラス変数のようにサブクラスからは見えないことを除いて、それらはクラス変数と同じです。

これの用途はかなり限定されそうです。それとも私が間違っていますか?コード内でクラス インスタンス変数の適切な使用法を見つけた人はいますか? または、このタイプのニュアンスが価値のある状況の例を挙げていただけますか?

4

3 に答える 3

4

クラスのインスタンス数を数えたいとします (サブクラスは含みません)。

class A
  @count = 0
  @@count = 0
  def self.inherited(subclass)
    subclass.instance_eval { @count = 0 }
  end
  def self.num_instances
    @count
  end
  def self.num_subclass_instances
    @@count
  end
  def self.new
    @count += 1
    @@count += 1
    super
  end
end
class B < A
end
class C < B
end

A.new
B.new
A.new
B.new
B.new
C.new

A.num_instances #=> 2
A.num_subclass_instances #=> 6
B.num_instances #=> 3
B.num_subclass_instances #=> 6
C.num_instances #=> 1
C.num_subclass_instances #=> 6

クラス変数は、すべてのクラスとそのサブクラスで共有されるため、使用できません。@@count によってBおよびに加えられた変更Cが に反映されますがA@count共有されないことに注意してください。

ただし、一般的には、クラス固有の設定を保存するのに非常に役立ちます。_why はDwemthy の Arrayでインスタンス属性の初期値を指定するために使用しますが、Ruby のメタプログラミングを行うとよく出てきます。

于 2009-05-21T01:32:11.037 に答える
3

はい、実際に持っています。これは、私が持っていたものからわずかに変更およびトリミングされたものです。

class Widget
  # class instance variable pattern
  class << self; attr_accessor :color; end

  def show_color()
    "This widget is #{self.class.color}"
  end
end
class WidgetR < Widget
  @color = "Russet"
end
class WidgetC < Widget
  @color = "Cordovan"
end
class WidgetL < Widget
  @color = "Liver"
end

WidgetR.new.show_color #=> "This widget is Russet"

しかし、私がそれを使用した場合、それが本当に必要かどうかはわかりません。メソッドをオーバーライドすることもできました。または色の方法を提供しました。または、クラス変数にハッシュとして格納します。または、各インスタンスにコピーを保持することもできます(わかりました、それはちょっとうんざりです)。きっと他にも可能性はあると思います…

さまざまな代替手段があり、構文は厄介です。私が推測していることを考えると、それを使用するのが最も自然なことである場合は、おそらくかなりまれです.

クラス変数とインスタンス変数を使用してこの動作を再現してみて、実現が難しいことを確認すると役立つ場合があります (ただし、メソッドを定義する場合などは簡単です)。

CJ

于 2009-05-21T17:30:00.660 に答える
3

クラス変数は、すべてのサブクラスを含むクラスのすべてのインスタンスで共有されます。階層全体でこの変数がまさに必要な場合もありますが、クラスごとに異なる変数が必要な場合もあります。クラス変数とは異なり、クラス インスタンス変数はクラス オブジェクトごとに異なる値を取ります。

http://martinfowler.com/bliki/ClassInstanceVariable.html

于 2009-05-20T23:58:26.623 に答える