6

この質問は、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 を反復処理するよりも高速に子孫を追跡するための内部実装を提供します。

もっと早く?わかりました。何かを返すより何も返さない方が速いはずですが (そうですか?)、提供されたクラスの子孫を返すことになっています。

4

2 に答える 2

3

https://github.com/rails/rails/issues/3364に記載されているように、クラスを熱心にロードする必要があります。

ActionDispatch::Reloader.to_prepare do
  Rails.application.eager_load!
end
于 2013-10-04T05:08:55.213 に答える
3

ActiveSupport::DescendantsTracker.descendants(Object)開発コンソールはアプリケーションをコンパイルせず、まだすべてのクラスをロードしていないため、それらを出力することを認識していないため、コンソールに空白が返されます!

この質問を見てください: RoR: MyModel.descendants returns [] in a view after the first call?

于 2013-05-24T15:05:58.727 に答える