2017-10-04 40 views
1

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

如果我读这段代码的权利,我看到以下内容:

  1. 一模块被定义为名为Mod,以及名为one的方法。然后调用module_function方法,将此方法的名称作为参数传递。
  2. 一个类定义为Cls,而Mod模块包含在这个类中,使得类访问在Mod中定义的方法。然后创建一个包装器方法,它只是将其调用委托给模块方法。
  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" 

因此,会是什么API示例代码的样子,如果两个one方法是同时定义的(而不是像文档中那样重新打开模块)?或者这是不可能的事情?

回答

3

会是什么样的API示例代码的样子,如果两个one方法已在同一时间

module Sprocket 
    def create 
    "Sprocket" 
    end 

    module_function :create 

    def create 
    "Sprocket 2.0" 
    end 
end 

你应该想象一个时间表,是不是rev​​ertable被定义。

第一个示例(使用one s):引入实例方法one,声明它是模块方法,引入新的实例方法one。模块方法保持不变。

你的代码create:介绍一个实例方法create,介绍了以下module_function宣布一切新的“双反”范围,既引入了新的模块化设计方法和redeclares实例方法。

上面的代码:介绍了一个实例方法,声明它是一个模块方法,引入了新的实例方法。