ruby中的include和extend都用于在类中中引入module,但是这两种方式是有区别的。
简单的说
1)使用include引入module之后,module中的方法会成为一个类的实例方法。
2)通过extend引入的module的方法则成为类的静态方法(类方法)。
这个区别以前不知道,坑死我了。立碑留念。
 
一个更详细的解释:
include主要用来将一个模块插入(mix)到一个类或者其它模块。
extend 用来在一个对象(object,或者说是instance)中引入一个模块,这个类从
直接 include <module name>即可

2.在类定义中引入模块,使模块中的方法成为类的类方法
这种情况也是比较常见的
直接 extend <module name>即可

3.在类定义中引入模块,既希望引入实例方法,也希望引入类方法
这个时候需要使用 include,
但是在模块中对类方法的定义有不同,定义出现在 方法
def self.included(c) ... end 中
代码示例:

 
  
  1. module Ma   
  2.   MA_VALUE = 1   
  3.   def ma_1   
  4.     puts "it is ma_1"   
  5.   end   
  6. end   
  7.    
  8. module Mb   
  9.   MB_VALUE = 1   
  10.   def self.included(c)   
  11.     def c.mb_2   
  12.       puts "it is mb_2"   
  13.     end   
  14.   end   
  15.   def mb_1   
  16.     puts "it is mb_1"   
  17.   end   
  18. end   
  19.    
  20. class Ca   
  21.   include Ma      
  22. end   
  23.      
  24. class Cb   
  25.   extend Ma   
  26.   include Mb   
  27. end   
  28.    
  29. c1 = Ca.new   
  30. c1.ma_1   
  31.    
  32. c2 = Cb.new   
  33. c2.mb_1   
  34. Cb.ma_1   
  35. Cb.mb_2   
  36.    
  37. puts Ma::MA_VALUE   
  38. puts Ca::MA_VALUE   
  39.    
  40. puts Mb::MB_VALUE   
  41. puts Cb::MB_VALUE