递归的子类列表

时间:2015-04-17 09:02:03

标签: ruby

我想知道为什么这段代码不起作用:

class Module
  def self.classes(base_module)
    arr = []

    base_module.constants(false).each do |constant|
      object = base_module.const_get(constant, false)

      if object.is_a?(Class)
        arr << object
      else
        arr.concat object.controllers(object)
      end
    end

    arr
  end
end

module Foo
  class Bar
  end

  module Ok
    module OkOk
      class Ooooook
      end
    end
  end
end

Foo.classes Foo
  

NoMethodError:未定义的方法`classes&#39; for Foo:Module

BTW,是否有更简单的方法从给定模块中获取所有子类?感谢。

1 个答案:

答案 0 :(得分:3)

这是因为FooModule的一个实例。因此,您需要将classes定义为实例方法。

class Module
  def classes(base_module)
    arr = []

    base_module.constants(false).each do |constant|
      object = base_module.const_get(constant, false)

      if object.is_a?(Class)
        arr << object
      else
        arr.concat object.classes(object)
      end
    end

    arr
  end
end

module Foo
  class Bar
  end

  module Ok
    module OkOk
      class Ooooook
      end
    end
  end
end

puts Foo.classes Foo
# >> Foo::Bar
# >> Foo::Ok::OkOk::Ooooook