【发布时间】:2016-01-15 18:37:24
【问题描述】:
如果我有 4 个具有以下层次结构的类:
class MainClass < ActiveRecord::Base
...
end
class SubClassA < MainClass
...
end
class SubClassB < MainClass
...
end
class SubClassC < MainClass
...
end
如何在不遍历并创建其他每个类的实例的情况下获取 MainClass 的子类列表?
在新的 IRB 会话中,我可以进去说
irb(main)> MainClass.descendants
=> []
但是,如果我遍历并创建每个子类的实例,我会看到以下内容
irb(main)> SubClassA.new
=> #<SubClassA ...>
irb(main)> SubClassB.new
=> #<SubClassB ...>
irb(main)> SubClassC.new
=> #<SubClassC ...>
irb(main)> MainClass.descendants
=> [SubClassA(...), SubClassB(...), SubClassC(...)]
我基本上是在寻找一种以编程方式提供所有子类的方法,所以将来当我想添加 SubClassD、SubClassE 等时,我不必担心每个子类都会在用户之前在代码中实例化可以看到他们。
【问题讨论】:
-
我在铁路控制台(rails 4.1.2)上试过。我得到了这个(而不是像你这样的空列表):-irb(main):012:0> MainClass.descendants => [SubClassA(表不存在),SubClassB(表不存在)]跨度>
-
有趣。最初,我将我的子类拆分为它们自己的文件(sub_class_a.rb、sub_class_b.rb、sub_class_c.rb),所有这些文件都在同一级别,我得到了上面详述的内容。当我将所有类合并到同一个 main_class.rb 中时,descendants 方法就像你说的那样工作。
标签: ruby-on-rails ruby