ruby中include与extend的差异

ruby中include与extend的区别
在Rspec的源码中,经常可以看见这样的代码:

KlassA extend ModA
KlassA include ModB

那么include和extend究竟有什么区别的?

简而言之,引用如下:

引用
    include : mixes in specified module methods as instance methods in the target class
    extend : mixes in specified module methods as class methods in the target class


也就是说,如果将1个module include到目标class的话,那么目标class的object就拥有这个module的instance method
如果将1个module extend到目标class的话,那么目标class就拥有这个module的class_method


代码演示如下:

module A
    def klass_method
        puts 'klass method'
    end

    def ins_method
        puts 'instance method'
    end

end

class B
end

B.class_eval do
    include A
end

B.new.ins_method # 'should puts instance method'
#B.klass_method # 'not define'

B.class_eval do
    extend A
end

B.klass_method # 'klass method'
B.ins_method # also as class method


需要注意的是,如果o.extend Mod的话,那么o将会获得Mod的方法作为其instance method,但是与o同属于1个类的对象则没有Mod的方法