ruby模块和类的错误

时间:2015-07-27 14:21:04

标签: ruby module

我想在rubygems.org上提供一个Ruby包,但我的问题出在我要编写实际代码的文件中,我很困惑。我看了一些教程并看到了类似的东西:

假设文件夹是

Mygem
  |__ lib
      |__ Mygem
         |__ Mygem.rb
         |__ version.rb

mygem.rb里面是代码:

class Sample
  "all codes"
end

module Somemodule
  class Someclass
  "somecodes"
  end

  def add(a,b)
    a+b
  end
end

包中需要哪两个代码以及如何调用模块的实例。比方说,我想使用模块的add方法。

我尝试过:

Somemodule::add.new(5,7)

但我得到一个未定义的方法'添加' for Somemodule:Module(nomethod error。)

我设法通过添加更改添加到 self.add 来使其工作,并且方法不应该有 .new 我想。也许只针对课程。我也尝试了Mymodule.add(4,7)并且它有效。

1 个答案:

答案 0 :(得分:1)

Somemodule#add是模块的实例方法,这意味着您只能在具有Module#include模块的类的实例或模块(包括类)上调用它Object#extend编辑模块(在后一种情况下,MyMod.add(5,7)MyClass.add(5,7)调用。)

要使用add作为模块方法(有时称为模块“函数”),您必须在模块中定义self.add(或extend模块本身 - 请参阅下文)。模块m的模块方法M被调用M.m,而不是M::m::用于引用M中的类和模块。 include Mextend M无视M的模块方法(如果有的话)。

最后,add与课程SampleSomemodule::Someclass无关,因此可以归结为:

module Somemodule
  def self.add(a,b)
    a+b
  end
end

Somemodule.methods(false)          #=> [:add]     
Somemodule.instance_methods(false) #=> []     
Somemodule.add(5,7)                #=>12

正如我上面提到的,你也可以写:

module Somemodule
  def add(a,b)
    a+b
  end
  extend(self)
end

创建模块和实例方法:add

Somemodule.instance_methods(false) #=> [:add]     
Somemodule.methods(false)          #=> []
Somemodule.methods.include?(:add)  #=> true     
Somemodule.method(:add).owner      #=> Somemodule
Somemodule.add(5,7)                #=> 12

此处extend可以在定义模块后调用:

module Somemodule
  def add(a,b)
    a+b
  end
end

Somemodule.extend(Somemodule)

Somemodule.instance_methods(false) #=> [:add]     
Somemodule.methods.include?(:add)  #=> true     
Somemodule.add(5,7)                #=>12