この質問は、Ruby でクラスのすべての子孫を検索することに関する別のスタック オーバーフローの質問に似ています/関連しています。私が探していた情報でいっぱいの素晴らしい質問です-レールコンソールにドロップダウンしたときを除いて:
irb(main):001:0> ActiveSupport::DescendantsTracker.descendants(Object)
=>[]
irb(main):002:0> ObjectSpace.each_object(Class).select { |klass| klass < Object }
=> [IRB::Notifier::AbstractNotifier, IRB::Notifier::ErrUnrecognizedLevel, ...]
では、ActiveSupport::DescendantsTracker が Object の子孫を返さないのはなぜでしょうか? 実装の違いは何ですか?DescendantsTrackerのドキュメントは、次のことを示唆しています。
このモジュールは、ObjectSpace を反復処理するよりも高速に子孫を追跡するための内部実装を提供します。
もっと早く?わかりました。何かを返すより何も返さない方が速いはずですが (そうですか?)、提供されたクラスの子孫を返すことになっています。