Ruby中的模块方法

Nis*_*yay 3 ruby inheritance module singleton-methods

这是我的代码:

module Star
  def Star.line
    puts '*' * 20
  end
end

module Dollar
  def Star.line
    puts '$' * 20
  end
end

module At
  def line
    puts '@' * 20
  end
end

include At
Dollar::line # => "@@@@@@@@@@@@@@@@@@@@"
Star::line   # => "$$$$$$$$$$$$$$$$$$$$"
Dollar::line # => "@@@@@@@@@@@@@@@@@@@@"
line         # => "@@@@@@@@@@@@@@@@@@@@"
Run Code Online (Sandbox Code Playgroud)

谁能解释我是如何得到这个结果的?我不明白这里的方法查找流程.

Max*_*nko 7

这就是我的看法:

Dollar::line

这个模块中没有定义这样的方法所以它正在调用,At::line因为你包含了这个模块.

Star::line

它使用Dollar模块的最后定义(它遵循原始Star定义,因此它被覆盖).

Dollar::line

第三次通话与第一次通话相同.

line

最后一个是At::line因为你做了一个包含.

  • 几乎.你的解释是正确的:顶层的`include`包含在`Object`中,从'Dollar.is_a?(Object)`开始,你可以调用在`Object`中定义的任何方法或混合到`Object`中的方法,包括`在#line`.但是,`At`中的`line`是一个实例方法(`at#line`),而不是模块函数(`At :: line`),这正是它的工作原理. (5认同)