这个generate_method被定义在模块G当中,它接受一系列参数,来动态创建相关的方法。于是我们就实现了这样的DSL功能:

通过在类C里面声明generate_method :method1, :method2,让类C动态的添加了两个实例方法method1,method2,是不是很有意思?

 

 

  1. module ModuleA 
  2.     def self.included(c)  #回调接口 
  3.     c.extend(ModuleB) 
  4.     end 
  5.  
  6.   module ModuleB 
  7.     def generate_method(*args) 
  8.       args.each do|method_name| 
  9.         define_method(method_name){puts method_name} 
  10.       end 
  11.     end 
  12.   end 
  13.  
  14. end 
  15. class Test 
  16.   include ModuleA 
  17.   generate_method :method_one , :method_two 
  18.  
  19. end 
  20.  
  21. a = Test.new 
  22. a.method_one 
  23. a.method_two