0

インスタンス化されたすべてのサブクラス オブジェクトをスーパー内の配列で追跡して、スーパーからメソッドを呼び出してそれらを反復処理できるようにしようとしています。私はほとんどそこにいると思いますが、何が欠けているのかわかりません。現在、super.my_array を呼び出すと、空の配列しか返されないため、初期化メソッドに何か問題があるはずです。これは私がこれまでに持っている抽象化されたバージョンです:

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
4

4 に答える 4

2

私はあなたの質問に別の答えを提供するつもりです...

正直なところ、私はおそらくこれについてあなたのアプローチを少し切り替えて、クラスが登録する別のクラス(Singletonモジュールを含む)を作成します。

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

さらに、これはその性質上、狂ったようにメモリをリークするため、WeakRefまたはrefのようなライブラリを使用して弱い/ソフト参照を保存することをお勧めします(これは以前に使用したり見たりしたことがありませんが、したい) と、KlassTracker クラスで弱い/ソフト参照のみを追跡します。

最後に、率直に言って、あなたが求めていることはややクレイジーだということを言わなかったら、私は気が進まないでしょう。あなたが何をしようとしているのかわかりませんが、おそらくより良いアプローチがあります。

于 2013-10-12T17:41:37.403 に答える
0

これはあなたのニーズを満たすでしょうか?

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'
于 2013-10-13T03:49:44.007 に答える