class Class
def mixin_ancestors(include_ancestors=true)
ancestors.take_while {|a| include_ancestors || a != superclass }.
select {|ancestor| ancestor.instance_of?(Module) }
end
end
class MyTestClass
end
从How do you list included Modules in a Ruby Class?
取得上述代码我有以下问题。
1)通过在上面的代码中说'def mixin_ancestors',我们定义了一个实例方法。但是做'a = MyTestClass.new; a.mixin_ancestors'表示未定义的方法mixin_ancestors。
2)所以我做了'MyTestClass。 mixin_ancestors’。它给了我一个清单。
3)我认为'祖先'是一种方法。在哪种情况下'祖先'方法运行。要找到我做'方法(祖先).owner'但得到错误 - method: [MyTestClass, Object, Kernel, BasicObject] is not a symbol (TypeError).
从我之前的问题Determine the class to which a method belongs in rails获得了这个技巧
4)与上述代码中的superclass
方法运行的第三点类似。
感谢帮助
答案 0 :(得分:2)
1& 2)我们正在定义Class
的实例方法,这意味着它将是其他对象的类方法。
3)它在Class
对象中运行,因此它是Class
或其中一个祖先的方法(它实际上在BasicObject
中)
4)它在Class
对象(或对象扩展它)的上下文中运行
答案 1 :(得分:0)
在ruby中,Class是类对象的类。在您的示例中,MyTestClass是类Class的实例。因此,mixin_ancestor是这些对象的实例方法。
在3)中,你应该使用方法(:祖先),但你只需要调用它 - 它返回一个数组 - 正如你在输出中看到的那样 - [MyTestClass,Object,Kernel,BasicObject]
4)self这里是Class
的一个实例我强烈建议你购买http://www.amazon.com/Metaprogramming-Ruby-Program-Like-Pros/dp/1934356476 - 这本书以优秀的方式解释了ruby!