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

标签 ruby function class module

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

相关文章:

ruby-on-rails - IntegrationTest 与 Mocha, stub HelperMethod (Ruby)

javascript - JavaScript 函数可以返回自身吗?

c++ - 使用 {a,b,c} 作为参数的构造函数或 {a,b,c} 实际上在做什么?

java - getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 抛出空指针异常

ruby-on-rails - rest_in_place 在 .each for 循环中选择

mysql - Rails 从 Rails 中的子表中获取数据

ruby - 实现 Ruby 的 IO.popen() 和 system() 的替代品

c++ - VB.NET DLL中的C++ DLL函数复制

python - 正确地将自己的功能应用于分组的 Pandas 数据框

Java字符串方法错误