13

Ruby では、すべてのモジュールのリストを取得するのは簡単です。

ObjectSpace.each_object(Module).to_a

しかし、すべての固有クラス (シングルトン クラスまたはメタクラスとも呼ばれます) のリストを取得することは可能ですか? それとも、固有クラスは見えませんか?

私は試した

str = "foo"
my_metaclass = class << str; self; end
my_metaclass.class == Class # my_metaclass' class is Class
ObjectSpace.each_object(Class).include?(my_metaclass) # false
ObjectSpace.each_object.include?(my_metaclass) # still false
# Just to show each_object works
ObjectSpace.each_object(Class).include?(String) # true

スクリプト内で定義されているすべてのメソッドをリストしたいので、固有クラスを取得しようとしています。モジュールとクラスによって定義されたすべてのインスタンス メソッドを探してから、モジュールとクラス (または、CPU をかみ砕く必要がある場合はすべてのオブジェクト) のシングルトン メソッドを探すことができますが、それは少しハックに思えます。

4

3 に答える 3

2

シングルトンメソッドを持つオブジェクトを意味する場合、これは機能するはずです。

eigens = []
ObjectSpace.each_object do |object|
  eigens << object unless object.singleton_methods.empty?
end

そうでない場合は、明確にしていただけますか?この議論を参考にしました:

http://www.ruby-forum.com/topic/77046

于 2011-11-06T14:59:16.443 に答える
1

MRI 1.9の時点では、固有クラスの列挙はサポートされていないようです。(半)結果として、すべてのメソッドを反復する100%信頼できる方法はありません。メソッド列挙子全体の最適な近似値は次のとおりです。

methods = []

ObjectSpace.each_object { |x|
  if x.kind_of?(Module)
    methods += x.public_instance_methods(false) +
               x.protected_instance_methods(false) +
               x.private_instance_methods(false)
  end
  methods +=   x.singleton_methods(false)
}

ただし、このコードは列挙されません

  • 1番目の固有クラスが所有するプライベートメソッド、
  • 2番目、3番目、...固有クラスが所有するメソッド。
于 2011-12-14T16:18:08.307 に答える