主要问题:在Ruby API docs的module_function
方法,我看到了下面的代码示例:定义了一个`module_function`,后来覆盖了相同的方法:存在多少个方法?
module Mod
def one
"This is one"
end
module_function :one
end
class Cls
include Mod
def call_one
one
end
end
Mod.one #=> "This is one"
c = Cls.new
c.call_one #=> "This is one"
module Mod
def one
"This is the new one"
end
end
Mod.one #=> "This is one"
c.call_one #=> "This is the new one"
如果我读这段代码的权利,我看到以下内容:
- 一模块被定义为名为
Mod
,以及名为one
的方法。然后调用module_function
方法,将此方法的名称作为参数传递。 - 一个类定义为
Cls
,而Mod
模块包含在这个类中,使得类访问在Mod
中定义的方法。然后创建一个包装器方法,它只是将其调用委托给模块方法。 - 直接调用模块方法,并在该类的新实例上调用包装器方法。这两个调用返回相同的东西。
之后,这一点是我感到困惑。然后重新打开该模块,并创建one
方法的新实现。然后再次执行两个原始方法调用(模块调用和类实例调用),这次使用不同的输出。
如果从各个方法调用中显示两个不同的输出,这意味着模块中现在必须有两个具有相同名称的不同方法。我正确吗?
相关问题:出于好奇,我想下面的代码,但它并没有产生相同的结果:
module Sprocket
def create
"Sprocket"
end
module_function
def create
"Sprocket 2.0"
end
end
class SprocketFactory
include Sprocket
def make
create
end
end
p Sprocket.create #=> "Sprocket 2.0"
p SprocketFactory.new.make #=> "Sprocket 2.0"
因此,会是什么API示例代码的样子,如果两个one
方法是同时定义的(而不是像文档中那样重新打开模块)?或者这是不可能的事情?