gpt4 book ai didi

ruby - 定义一个 `module_function` 然后覆盖相同的方法 : how many methods exist?

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:40 25 4
gpt4 key购买 nike

主要问题: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"

如果我正确阅读这段代码,我会看到以下内容:

  1. 定义了一个名为 Mod 的模块,以及一个名为 one 的方法。然后调用 module_function 方法,将此方法的名称作为参数传递。
  2. 定义了一个名为 Cls 的类,Mod 模块包含在该类中,使该类可以访问 Mod 中定义的方法>。然后创建一个包装器方法,它只是将其调用委托(delegate)给模块方法。
  3. 直接调用模块方法,并在类的新实例上调用包装器方法。两个调用返回相同的内容。

在那之后我就感到困惑了。然后重新打开该模块并创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com