2011-08-30 42 views
1

对不起,标题很糟糕,但我有点失落。DelegateClass和类似方法在哪个对象/类上存在?

我想弄清楚哪些对象/类生活方法,如DelegateClass和这些类型的方法的术语是什么。我正在阅读Metaprogramming Ruby,在这本书中,这些方法通常称为模仿方法,但在互联网上搜索可以得到各种结果,所以我想知道他们是否有更好的名字。

我检查了DelegateClass的源代码,我假设它已添加到Object,但它不在那里。我可以看到类Delegator和SimpleDelegator,它们在同一个rb文件中,增加了作为常量(尽管我不确定它们是如何被添加的)。

谢谢!

回答

3

刚刚找到答案。这是在对象

ruby-1.9.2-p290 :033 > Object.private_instance_methods(false).grep /Dele/ 
=> [:DelegateClass] 

编辑的私有方法

我发现了什么,我需要了解是什么是当前类?在给定的上下文中。

+0

这是正确的答案('选择'的答案是错误的),但使用'方法(:DelegateClass).owner'来验证,而不是grep;) – horseyguy

0

仔细看看文件。

def DelegateClass(superclass) 
    klass = Class.new(Delegator) 
    ... 

,并使用

method(:DelegateClass).owner 

找到类的地方坐。正如在注释中提到的,Module上的私有实例方法包含Object上定义的任何东西。

所以不,DelegateClass()是不是一种特殊的方法,除了被称为大写(这使得它看起来像一个常数)。它只是返回一个可以继承的现场创建的匿名类。

+0

非常感谢Julik!我不知道的非常重要的一点是,脚本中定义的方法被添加到Module中!顺便说一下,我在'irb'中定义了一个方法,并将它添加到Module中(不知道它是否适用于pry)。 – Augusto

+2

@Julik:这是不正确的,该方法被定义为Object中的私有实例方法,无论它是在irb还是pry中定义,还是在ruby脚本中运行,都使用Method#owner来揭示:方法(:DelegateClass).owner => Object'。你的'Module.private_instance_method'返回你得到的结果的原因是因为'Module'是Object的一个子类。尽管如此,'DelegateClass'是'Object'上的私有实例方法。 – horseyguy

+0

方法#所有者非常整洁的技巧,不知道!谢谢! – Julik

相关问题