ruby中include与extend的差异
ruby中include与extend的区别
在Rspec的源码中,经常可以看见这样的代码:
那么include和extend究竟有什么区别的?
简而言之,引用如下:
也就是说,如果将1个module include到目标class的话,那么目标class的object就拥有这个module的instance method
如果将1个module extend到目标class的话,那么目标class就拥有这个module的class_method
代码演示如下:
需要注意的是,如果o.extend Mod的话,那么o将会获得Mod的方法作为其instance method,但是与o同属于1个类的对象则没有Mod的方法
在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
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的方法