Ruby中能否在class << self内定义initialize?实例计数实现疑问
问题解答
关于eigenclass的initialize方法调用
没办法让eigenclass先创建并触发其initialize方法。Ruby中类的创建逻辑是先生成主类,再创建它的单例类(即你写的class << self对应的eigenclass),而且eigenclass是Ruby内部管理的特殊类,不会通过new方法实例化,所以你定义的eigenclass的initialize方法永远不会被自动调用,这个思路走不通。
可行的实例计数初始化方案
要实现父类和子类各自独立统计实例数量,有两种常用方案:
方案1:利用inherited钩子方法
Ruby的类提供inherited钩子,当子类继承父类时会自动触发,我们可以用它来给子类初始化计数:
class Point class << self attr_accessor :count # 子类继承时自动初始化子类的count def inherited(subclass) subclass.count = 0 end end # 先初始化父类自己的count self.count = 0 def initialize(position) @position = position self.class.count += 1 end end # 测试父类 p1 = Point.new(1) p2 = Point.new(2) puts Point.count # 输出:2 # 测试子类 class MyPoint < Point; end mp1 = MyPoint.new(3) puts MyPoint.count # 输出:1
方案2:在count的getter中设置默认值
通过改造count的获取方法,第一次访问时自动初始化计数,无需提前赋值:
class Point class << self def count # 如果@count未初始化,自动设为0 @count ||= 0 end def count=(value) @count = value end end def initialize(position) @position = position self.class.count += 1 end end # 测试父类 p = Point.new(1) puts Point.count # 输出:1 # 测试子类 class MyPoint < Point; end mp = MyPoint.new(2) puts MyPoint.count # 输出:1 puts Point.count # 输出:1
这两种方案都能保证父类和子类拥有独立的计数变量,不会互相干扰。
内容的提问来源于stack exchange,提问作者user200783
相关产品推荐
相关产品推荐

