繁体   English   中英

了解Ruby mixin的代理类机制

[英]Understanding the Ruby mixin's proxy class mechanism

我指的是以下相关文章,段落“陷阱#1”: http ://definingterms.com/2013/03/23/pitfalls-of-ruby-mixins/

我有以下设置,本文中使用的设置略有更改:

module EmailReporter
    def send_report
        #Sending a report ...
        puts self.class
    end
end

class Person
end

class Employee < Person
    include EmailReporter
end

据我了解,当我在Employee中包含EmailReporter时,其方法不仅会粘贴到其中,而且还会创建一个匿名代理类并将其放入Employee上方和Person下的继承链中。

当我调用Employee.new.send_report时,我不在Employee范围内,而是在代理类范围内。 因此,我将无法访问Employee的常量或类变量,但可以访问实例变量。

问题:

  1. 如果我运行Employee.new.send_report,则输出为“ Employee”,而不是“ Employee__proxy_class”。 这是为什么? “自我”不应该引用代理类吗?

  2. 本文建议代理类委托对模块EmailReport的方法调用。 但是,当然不能仅在其上调用实例方法。 那么代理类将其委托给谁?

感谢大家试图回答我的问题!

我认为您的根本问题在于了解self的价值。 通常,仅添加告诉您代码不同点的self代码通常会很有帮助。 让我们从一个非常简单的示例开始:

class Dad
  def hi
    puts "self in Dad#hi = #{self}"
  end
end

class Son < Dad
end

son = Son.new
  #=> #<Son:0x007fc1f2966b88>
son.methods.include?(:hi)
  #=> true
son.hi
  # self in Dad#hi = #<Son:0x007fc1f2966b88>

只是因为:

son.method(:hi).owner
  #=> Dad

并不意味着在对self调用hi时, self会改变。 现在让我们包括一个混合:

module Helper
  def hi
    puts "self in Helper#hi = #{self}"
  end
end

Son.include Helper

son.hi
  # self in Helper#hi = #<Son:0x007fc1f29551d0>
son.method(:hi).owner
  #=> Helper 

我认为您了解为什么在这里调用Helper#hi而不是Dad#hi

这能回答您的第一个问题吗? 我不明白第二个问题,但是既然您已经了解了self ,也许您可​​以自己回答。 如果不是,请说明#2(对您的问题进行编辑)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM