主要问题:在Ruby API docs对于 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
中定义的方法>。然后创建一个包装器方法,它只是将其调用委托(delegate)给模块方法。 - 直接调用模块方法,并在类的新实例上调用包装器方法。两个调用返回相同的内容。
在那之后我就感到困惑了。然后重新打开该模块并创建 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"
因此,如果同时定义了两个 one
方法(而不是像文档中那样重新打开模块),API 示例代码会是什么样子?或者这样的事情是不可能的?
最佳答案
what would the API example code look like if the two
one
methods had been defined at the same time
module Sprocket
def create
"Sprocket"
end
module_function :create
def create
"Sprocket 2.0"
end
end
你应该想象一个不可逆转的时间线。
第一个例子(带one
s):引入一个实例方法one
, 将其声明为模块方法,引入新的实例方法 one
.模块方法保持不变。
您的代码 create
: 引入实例方法 create
, 为下面用 module_function
声明的所有内容引入新的“双重”范围, 都引入了新的模块方法并重新声明了实例方法。
上面的代码:引入一个实例方法,声明它是一个模块方法,引入新的实例方法。
关于ruby - 定义一个 `module_function` 然后覆盖相同的方法 : how many methods exist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46567272/