我想知道为什么这段代码不起作用:
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
BTW,是否有更简单的方法从给定模块中获取所有子类?感谢。NoMethodError:未定义的方法`classes&#39; for Foo:Module
答案 0 :(得分:3)
这是因为Foo
是Module
的一个实例。因此,您需要将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