Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 向超类中的数组添加实例化的子类_Ruby_Oop_Inheritance - Fatal编程技术网

Ruby 向超类中的数组添加实例化的子类

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

我试图在super中跟踪数组中所有实例化的子类对象,这样我就可以从super调用一个方法来迭代它们。我想我就快到了,但我不知道我错过了什么。当前,当我调用super.my_array时,它只返回一个空数组,因此我的initialize方法肯定有问题。这是迄今为止我所拥有的抽象版本:

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的运行时开销和复杂性