Ruby 向超类中的数组添加实例化的子类
我试图在super中跟踪数组中所有实例化的子类对象,这样我就可以从super调用一个方法来迭代它们。我想我就快到了,但我不知道我错过了什么。当前,当我调用super.my_array时,它只返回一个空数组,因此我的initialize方法肯定有问题。这是迄今为止我所拥有的抽象版本:Ruby 向超类中的数组添加实例化的子类,ruby,oop,inheritance,Ruby,Oop,Inheritance,我试图在super中跟踪数组中所有实例化的子类对象,这样我就可以从super调用一个方法来迭代它们。我想我就快到了,但我不知道我错过了什么。当前,当我调用super.my_array时,它只返回一个空数组,因此我的initialize方法肯定有问题。这是迄今为止我所拥有的抽象版本: class Klass attr_reader :my_array @@my_array = [] def initialize @@my_array << self if super
class Klass
attr_reader :my_array
@@my_array = []
def initialize
@@my_array << self if super.class == Klass
end
def self.iterate_over_sub
@@my_array.each { |x| x.sub_method }
end
def sub_method
puts "#{self.class} is being called by super"
end
end
Klass类
属性读取器:我的数组
@@my_数组=[]
def初始化
@@我的数组我将为您的问题提供另一个答案
老实说,我可能会稍微改变一下你的方法,创建一个单独的类(包括Singleton模块),让你的Klass注册,例如
class Klass
def initialize
KlassTracker.instance.track(self)
end
end
require 'singleton'
class KlassTracker
include Singleton
def initialize
@instances = []
end
def track(instance)
@instances << []
end
end
Klass类
def初始化
KlassTracker.instance.track(self)
结束
结束
要求“单身”
类KlassTracker
包括独生子女
def初始化
@实例=[]
结束
def轨迹(实例)
@实例我将为您的问题提供另一个答案
老实说,我可能会稍微改变一下你的方法,创建一个单独的类(包括Singleton模块),让你的Klass注册,例如
class Klass
def initialize
KlassTracker.instance.track(self)
end
end
require 'singleton'
class KlassTracker
include Singleton
def initialize
@instances = []
end
def track(instance)
@instances << []
end
end
Klass类
def初始化
KlassTracker.instance.track(self)
结束
结束
要求“单身”
类KlassTracker
包括独生子女
def初始化
@实例=[]
结束
def轨迹(实例)
@实例我将为您的问题提供另一个答案
老实说,我可能会稍微改变一下你的方法,创建一个单独的类(包括Singleton模块),让你的Klass注册,例如
class Klass
def initialize
KlassTracker.instance.track(self)
end
end
require 'singleton'
class KlassTracker
include Singleton
def initialize
@instances = []
end
def track(instance)
@instances << []
end
end
Klass类
def初始化
KlassTracker.instance.track(self)
结束
结束
要求“单身”
类KlassTracker
包括独生子女
def初始化
@实例=[]
结束
def轨迹(实例)
@实例我将为您的问题提供另一个答案
老实说,我可能会稍微改变一下你的方法,创建一个单独的类(包括Singleton模块),让你的Klass注册,例如
class Klass
def initialize
KlassTracker.instance.track(self)
end
end
require 'singleton'
class KlassTracker
include Singleton
def initialize
@instances = []
end
def track(instance)
@instances << []
end
end
Klass类
def初始化
KlassTracker.instance.track(self)
结束
结束
要求“单身”
类KlassTracker
包括独生子女
def初始化
@实例=[]
结束
def轨迹(实例)
@实例不确定您想要实现什么,但我看到了一些潜在的问题
attr_reader在实例级别定义了一个访问器,所以它与类变量无关。基本上,当你说attr\u reader:my\u array
时,它定义了这样一个方法
def my_array
@my_array
end
其次,您最好检查以下类型:
@@my_array << self if self.is_a?(Klass)
@@my_array不确定您想要实现什么,但我看到了一些潜在的问题
attr_reader在实例级别定义了一个访问器,所以它与类变量无关。基本上,当你说attr\u reader:my\u array
时,它定义了这样一个方法
def my_array
@my_array
end
其次,您最好检查以下类型:
@@my_array << self if self.is_a?(Klass)
@@my_array不确定您想要实现什么,但我看到了一些潜在的问题
attr_reader在实例级别定义了一个访问器,所以它与类变量无关。基本上,当你说attr\u reader:my\u array
时,它定义了这样一个方法
def my_array
@my_array
end
其次,您最好检查以下类型:
@@my_array << self if self.is_a?(Klass)
@@my_array不确定您想要实现什么,但我看到了一些潜在的问题
attr_reader在实例级别定义了一个访问器,所以它与类变量无关。基本上,当你说attr\u reader:my\u array
时,它定义了这样一个方法
def my_array
@my_array
end
其次,您最好检查以下类型:
@@my_array << self if self.is_a?(Klass)
@@my_array要迭代特定类的实例,可以使用:
要迭代特定类的实例,可以使用:
要迭代特定类的实例,可以使用:
要迭代特定类的实例,可以使用:
这能满足你的需要吗
class A
@@instances = []
def self.new
a = super
@@instances << a
a
end
def self.tryit
@@instances.each {|e| e.test}
end
end
class B < A
def test
puts "hi"
end
end
b = B.new
c = B.new
b.test # => 'hi'
A.tryit # => 'hi\nhi'
A类
@@实例=[]
def self.new
a=超级
@@“嗨”
A.tryit#=>“你好”
这能满足您的需要吗
class A
@@instances = []
def self.new
a = super
@@instances << a
a
end
def self.tryit
@@instances.each {|e| e.test}
end
end
class B < A
def test
puts "hi"
end
end
b = B.new
c = B.new
b.test # => 'hi'
A.tryit # => 'hi\nhi'
A类
@@实例=[]
def self.new
a=超级
@@“嗨”
A.tryit#=>“你好”
这能满足您的需要吗
class A
@@instances = []
def self.new
a = super
@@instances << a
a
end
def self.tryit
@@instances.each {|e| e.test}
end
end
class B < A
def test
puts "hi"
end
end
b = B.new
c = B.new
b.test # => 'hi'
A.tryit # => 'hi\nhi'
A类
@@实例=[]
def self.new
a=超级
@@“嗨”
A.tryit#=>“你好”
这能满足您的需要吗
class A
@@instances = []
def self.new
a = super
@@instances << a
a
end
def self.tryit
@@instances.each {|e| e.test}
end
end
class B < A
def test
puts "hi"
end
end
b = B.new
c = B.new
b.test # => 'hi'
A.tryit # => 'hi\nhi'
A类
@@实例=[]
def self.new
a=超级
@@“嗨”
A.tryit#=>“你好”
此外,如果您不希望维护此实例列表的运行时开销和复杂性,请使用ObjectSpace。每个对象(Klass)都是另一种选择。这是我一直坚持的编程挑战,因此性能不是真正的问题。我只是想提高我的ruby技能,但是谢谢你给我指明了正确的方向!啊,很有意思……一般来说,我尽量远离@--变量(类变量)。与Java版本相比,它们的使用非常困难。因此我倾向于单例混入。此外,如果您不希望维护此实例列表的运行时开销和复杂性,请使用ObjectSpace。每个_对象(Klass)都是另一种选择。这是我一直坚持的编程挑战,因此性能并不是一个真正的问题。我只是想提高我的ruby技能,但是谢谢你给我指明了正确的方向!啊,很有意思……一般来说,我尽量远离@--变量(类变量)。与Java版本相比,它们的使用非常困难。因此我倾向于单例混合。此外,如果您不想拥有main的运行时开销和复杂性