扩展和包括

时间:2014-06-05 20:54:31

标签: ruby include

Rubymonk 4.1标题为" included回调和extend方法"我要求我在下面的练习中修改模块Foo,这样当你将它包含在类Bar中时,它还会将ClassMethods中的所有方法作为类方法添加到Bar中。

module Foo
  module ClassMethods
    def guitar
      "gently weeps"
    end
  end
end

class Bar
  include Foo
end

puts Bar.guitar

必须在模块中定义self.included(base)方法,并使用ClassMethods扩展基础。

我一直在修修补补,无法弄明白。

指导请:D

3 个答案:

答案 0 :(得分:3)

您定义了一个名为self.included(base)的方法。

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

  module ClassMethods    
    def hey
      p "hey!"
    end
  end
end

class Bar
  include Foo
end

puts Bar.hey #=> hey!

这是有效的,因为.included会在包含模块时随时调用。在.included内部,您的代码使用ClassMethods

中的方法扩展基类

John Nunemaker在这里有一篇很好的帖子,详细信息如下:

Include vs Extend in Ruby

更详细地查看帖子底部的问题答案。这是一个很好的阅读。

答案 1 :(得分:0)

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

  module ClassMethods    
    def guitar
      "gently weeps"
    end
  end
end

class Bar
  include Foo
end

puts Bar.guitar

答案 2 :(得分:-1)

您需要使用ActiveSupport::Concern http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

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

  module ClassMethods
    def guitar
      "gently weeps"
    end
  end
end

class Bar
  include Foo
end

puts Bar.guitar