如何扩展这个Ruby模块?

时间:2016-04-16 09:54:11

标签: ruby

我试图在我建造的宝石中使用Gmail宝石。从the source,您可以看到gem定义了Gmail模块/类,如此(简化):

module Gmail
  class <<  self
    def connect; end
  end
end

我想要做的是将Gmail模块/类扩展为我自己的类。从本质上讲,这是我尝试做的一个通用示例:

module Foo 
  class << self
    def example
      puts :this_is_foo
    end 
  end 
end

class Bar
  extend Foo
end

然后我应该可以致电:

Bar.example

但我得到以下例外:

NoMethodError: undefined method `example' for Bar:Class

如何在上面的示例中Foo中提供Bar中提供的方法?

1 个答案:

答案 0 :(得分:2)

您可以使用included作为目标:

module Foo
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def example
      puts :this_is_foo
    end 
  end
end

class Bar
  include Foo
end

Bar.example
this_is_foo
#=> nil

或者,如果您只想包含类方法,可以创建example方法实例并扩展Bar模块:

module Foo
  def example
    puts :this_is_foo
  end 
end
class Bar
  extend Foo
end
Bar.example
this_is_foo
#=> nil