我必须在这里犯一个n00b错误。我编写了以下Ruby代码:
module Foo
def bar(number)
return number.to_s()
end
end
puts Foo.bar(1)
test.rb:6:在<main>': undefined method
栏中为Foo:模块(NoMethodError)
我希望在名为Foo.bar的模块上定义一个方法。但是,当我尝试运行代码时,我得到一个未定义的方法错误。我做错了什么?
答案 0 :(得分:7)
你可以这样做:
module Foo
def self.bar(number)
number.to_s
end
end
puts Foo.bar(1)
答案 1 :(得分:2)
Ruby中的每个模块都可以混合在一个对象中。一个类是一个对象后,您可以使用单词 extend 混合类中的方法:
module Foo
def bar
'bar'
end
end
class MyInstanceMethods
include Foo
end
class MyClassMethods
extend Foo
end
## Usage:
MyInstanceMethods.new.bar
=> "bar"
MyClassMethods.bar
=> "bar"
如果你希望直接从Foo模块调用bar方法,你可以用@xdazz写的相同方式,但由于 extend 字混合到一个类:
MyInstanceMethods.class
=> Class
MyClassMethods.class
=> Class
Module.class
=> Class # Hey, module is also a class!!!!!
诀窍:
module Foo
extend self # self of Foo is the Module!
def bar
# .....
end
end
现在您可以看到 Foo.bar 返回预期结果:P