【问题标题】:On which object/class does DelegateClass and similar methods live?DelegateClass 和类似方法存在于哪个对象/类上?
【发布时间】:2011-08-30 11:33:18
【问题描述】:

抱歉标题不好,但我有点迷路了。

我正在尝试找出哪些对象/类实时方法(例如 DelegateClass)以及这些方法类型的术语是什么。我正在阅读 Metaprogramming Ruby 并且在书中,这些方法通常称为 Mimic Methods,但是在互联网上搜索它会给出各种结果,所以我想知道是否有更好的名称他们。

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

谢谢!

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    刚刚找到答案。它是 Object 中的私有方法

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

    编辑

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

    【讨论】:

    • 这是正确答案('selected' 答案是错误的),但是使用method(:DelegateClass).owner 来验证而不是 grep ;)
    【解决方案2】:

    仔细查看文件。

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

    并使用

    method(:DelegateClass).owner
    

    找到它所在的班级。正如 cmets 中提到的,Module 上的私有实例方法包含 Object 上定义的任何内容。

    所以不,DelegateClass() 在任何方面都不是特殊方法,除了以大写形式调用(这使它看起来像一个常量)。它只是返回一个可以继承的现场创建的匿名类。

    【讨论】:

    • 非常感谢朱利克!我不知道的非常重要的一点是,脚本中定义的方法被添加到模块中!顺便说一句,我在irb 中定义了一个方法,并将其添加到 Module 中(不知道它是否适用于 pry)。
    • @Julik:这是不正确的,该方法被定义为Object上的私有实例方法,无论是在irb或pry中定义还是在ruby脚本中运行,使用Method#owner发现这个:method(:DelegateClass).owner => Object。您的Module.private_instance_method 返回您得到的结果的原因是因为Module 是Object 的子类。尽管如此,DelegateClassObject 上的私有实例方法。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多