在Ruby模块中定义公共方法?

时间:2013-04-24 01:36:35

标签: ruby

我必须在这里犯一个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的模块上定义一个方法。但是,当我尝试运行代码时,我得到一个未定义的方法错误。我做错了什么?

2 个答案:

答案 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