你曾经在任何Ruby代码中使用过"类实例变量"吗?

pez*_*ser 7 ruby inheritance scope class instance-variables

我可以理解为什么你需要一个类变量来跟踪已经在该类中实例化的对象的总数.

我可以理解为什么你需要一个实例变量来存储该类中特定对象的属性.

但是类实例变量我似乎无法证明是正确的.

据我了解,它们就像类变量一样,除了它们对类变量的方式不可见.

似乎这种用途非常有限.还是我错了?有没有人在代码中找到了很好的类实例变量?或者你能举例说明这种细微差别有价值的情况吗?

ram*_*ion 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
Run Code Online (Sandbox Code Playgroud)

您不能使用类变量,因为它在所有类及其子类之间共享。@@count 请注意对B和所做的更改如何C反映在 中A,但@count不共享。

但总的来说,它对于存储任何特定于类的设置非常有用。_why 在Dwemthy 的数组中使用它来指定实例属性的初始值,并且在进行 ruby​​ 元编程时它会经常出现。