我能理解为什么您需要一个类变量来跟踪诸如已在该类中实例化的对象总数之类的事情。
我能理解为什么您需要一个实例变量来存储该类中特定对象的属性。
但是类实例变量我似乎无法证明。
据我了解,它们就像类变量一样,只是它们对子类不可见,就像类变量一样。
看来它的用途非常有限。还是我错了?有没有人在他们的代码中发现类实例变量的一个很好的用途?或者,您能否举例说明这种细微差别会很有值(value)的情况?
最佳答案
假设你想统计一个类(不包括子类)的实例数
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
反射(reflect)在 A
中,但 @count
不共享。
不过,一般来说,它对于存储任何类特定设置非常有用。 _为什么在 Dwemthy's Array 中使用它为实例属性指定初始值,在进行 ruby 元编程时经常出现。
关于ruby - 您是否曾在任何 Ruby 代码中使用过 "class instance variable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890712/