6

我一定在这里犯了一个 n00b 错误。我编写了以下 Ruby 代码:

module Foo
   def bar(number)
      return number.to_s()
   end
end
puts Foo.bar(1)

test.rb:6:in <main>': undefined methodbar' for Foo:Module (NoMethodError)

我希望在名为 Foo.bar 的模块上定义一个方法。但是,当我尝试运行代码时,出现未定义的方法错误。我究竟做错了什么?

4

2 回答 2

9

你可以这样做:

module Foo
   def self.bar(number)
      number.to_s
   end
end
puts Foo.bar(1)
于 2013-04-24T01:41:30.087 回答
5

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 所写的相同方式进行操作,但是由于扩展字混合为一个类:

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

于 2013-04-24T03:06:47.043 回答