ruby - 您是否曾在任何 Ruby 代码中使用过 "class instance variable"?

标签 ruby class inheritance scope instance-variables

我能理解为什么您需要一个类变量来跟踪诸如已在该类中实例化的对象总数之类的事情。

我能理解为什么您需要一个实例变量来存储该类中特定对象的属性。

但是类实例变量我似乎无法证明。

据我了解,它们就像类变量一样,只是它们对子类不可见,就像类变量一样

看来它的用途非常有限。还是我错了?有没有人在他们的代码中发现类实例变量的一个很好的用途?或者,您能否举例说明这种细微差别会很有值(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 所做的更改 BC 反射(reflect)在 A 中,但 @count 不共享。

不过,一般来说,它对于存储任何类特定设置非常有用。 _为什么在 Dwemthy's Array 中使用它为实例属性指定初始值,在进行 ruby​​ 元编程时经常出现。

关于ruby - 您是否曾在任何 Ruby 代码中使用过 "class instance variable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890712/

相关文章:

ruby-on-rails - 如何将 Rake 任务作为 Windows "scheduled task"运行?

ruby - 这个正则表达式如何拆分第一个元音?

java - Java中的重叠对象

c# - 从抽象父类调用泛型列表上的方法

来自非成员函数的 C++ 虚拟继承

javascript - 开发模式下 Assets 编译缓慢

ruby-on-rails - simple_form collection_Radio_buttons 生成额外的标签

python实例变量作为可选参数

ruby - 用圆括号按名称调用 ruby​​ 类

PHP:如何调用类层次结构中的所有同名方法?