使用define_method

 define_method用于将实例方法动态添加到类或对象中,它接受一个符号(用做方法名)和一个代码块(用做方法体)作为参数,实际上这个代码块是通过instance_eval来执行的,因为define_method是private的。所以:

Ruby代码
  1. define_method(:activity) { puts "Playing!" }  

这句话是错误的,应该这样:

Ruby代码
  1. Object.class_eval { define_method(:activity) { puts "Playing!" } }  


给类动态添加方法:

  • 在类中添加方法,则不用考虑define_method 是私有的问题

 

Ruby代码
  1. class MyClass    
  2.   define_method(:mymeth) { puts "This is my method." }    
  3. end  

 

  • 在类级给类添加方法:

 

Ruby代码
  1. class MyClass   
  2.   def self.new_method(name,&block)   
  3.     define_method(name){block}   
  4.     puts block.inspect   
  5.   end  
  6. end  
  7. MyClass.new_method(:show) { puts "show"  }   
  8. c = MyClass.new  
  9. c.show  

 

  • 在实例级给类添加方法:

 

Ruby代码
  1. class MyClass   
  2.   def new_method(name,&block)   
  3.     self.class.send(:define_method,name,block)   
  4.   end  
  5. end  
  6. x = MyClass.new  
  7. x.new_method(:show) { puts "show"  }   
  8. x.show  

你可能感兴趣的:(使用define_method)