Ruby mixin覆盖方法澄清

Vla*_*ich 12 ruby module mixins

我刚刚面对这种我不太懂的行为.

module M
  def foo
    "module_foo"
  end
end

class C
  def foo
    "class_foo"
  end
  include M
end

puts C.new.foo
Run Code Online (Sandbox Code Playgroud)

为什么C.new.foo实际回归class_foo?我非常确定该方法应该被模块中的方法覆盖.另一件事,取而代之"class_foo"superC.new.foo返回`"module_foo"

实际上看起来模块在定义类实例方法之前以某种方式包含在内.你能澄清一下吗?

Aur*_*ini 15

编程红宝石上混入部分:

事实上,混合模块有效地表现为超类.

所以你经历的是正常的.你的模块M是你的C类的超类

因此,C类中的foo方法会覆盖模块M中的foo方法


and*_*vom 5

下面是 ruby​​ 进行方法查找的方式:

  1. 接收者的单例类;
  2. 接收者的类别;
  3. 任何包含的模块方法;
  4. 在接收者的超类中重复查找;
  5. 如果根本没有找到方法,则调用method_missing;

您可以在这里找到更多详细信息:http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

因此,为了找到一个方法,Ruby 会进入接收者的类,并从那里爬上祖先链,直到找到该方法。这种行为也称为“向右一步,然后向上”规则:向右一步进入接收者的类,然后沿着祖先链向上移动,直到找到该方法。当您在类中(甚至在另一个模块中)包含模块时,Ruby 会创建一个包装该模块的匿名类,并将匿名类插入到链中,就在包含类本身的上方。