确定方法运行的上下文

时间:2011-09-06 07:10:10

标签: ruby

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方法运行的第三点类似。

感谢帮助

2 个答案:

答案 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!