我想在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)并且它有效。
答案 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 M
和extend M
无视M
的模块方法(如果有的话)。
最后,add
与课程Sample
和Somemodule::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