[英]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的常量或类变量,但可以访问实例变量。
问题:
如果我运行Employee.new.send_report,则输出为“ Employee”,而不是“ Employee__proxy_class”。 这是为什么? “自我”不应该引用代理类吗?
本文建议代理类委托对模块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.