6

这个问题与另一个关于在 Ruby 中查找类的所有后代的堆栈溢出问题类似/相关。一个很好的问题,里面充满了我正在寻找的信息——除了当我进入 Rails 控制台时:

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

ActiveSupport::DescendantsTracker.descendants(Object)将在您的控制台中返回空白,因为开发控制台未编译您的应用程序,它尚未加载所有类,因此不知道它们以输出它们!

看看这个问题:RoR: MyModel.descendants 在第一次调用后在视图中返回 []?

于 2013-05-24T15:05:58.727 回答
3

您需要预先加载类,如:https ://github.com/rails/rails/issues/3364 中所述

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