Ruby之猴子补丁

何谓猴子补丁(Monkey Patch)?在动态语言中,不修改源代码而对功能进行追加和变更。 

使用猴子补丁的目的: 
1、追加功能 
2、功能变更 
3、修正程序错误 
4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 
5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。 

Ruby的类都是开放类,即在类定义之后还可以任意添加内容, 这就使得在Ruby中使用猴子补丁变得特别容易了。另外,Ruby还提供了对方法、类和模块的进行操作的功能,让我们使用猴子补丁更加得心应手。Ruby提供的基本功能如下: 
      alias:给方法另起别名 
      include:引入其他模块的方法 
      remove_method: 取消本类中的方法 
      undef:取消方法 
例子: 
alias:

Ruby代码  收藏代码
  1. class Monkey2 < Monkey  
  2.   def method2  
  3.     puts "This is method2"  
  4.   end  
  5.     
  6.   alias output method2  
  7. end  
  8.   
  9. monkey = Monkey2.new  
  10. monkey.method2  
  11. monkey.output  


include:

Ruby代码  收藏代码
  1. module Helper  
  2.   def help  
  3.     puts "Help..."  
  4.   end  
  5.     
  6.   def method1  
  7.     puts "helper method1..."  
  8.   end  
  9. end  
  10.   
  11. class Monkey  
  12.   include Helper  
  13.   def method1  
  14.     puts "monkey method1..."  
  15.   end  
  16. end  
  17.   
  18. monkey = Monkey.new  
  19. monkey.help  
  20. monkey.method1#因为重名,当前类的方法优先  



undef:

Ruby代码  收藏代码
  1. class Monkey  
  2.   def method1  
  3.     puts "This is method1"  
  4.   end  
  5. end    
  6.   
  7. class Monkey2 < Monkey  
  8.   def method2  
  9.     puts "This is method2"  
  10.   end  
  11. end  
  12.   
  13. monkey = Monkey2.new  
  14. monkey.method1   
  15. monkey.method2  
  16.   
  17. class Monkey2  
  18.   undef method1  
  19.   undef method2  
  20. end  
  21.   
  22. monkey.method1  
  23. monkey.method2  


我们还可以使用undef_method或者remove_method实现undef <method_name>同样的功能,例子如下:

Ruby代码  收藏代码
  1. class Monkey2  
  2.  remove_method :method1  
  3.  undef_method :method2  
  4. nd  



猴子补丁是一个非常诱人的功能,尤其是在java的那个改个标点符号都要重新编译、打包的世界。因此,老衲内心十分的喜欢,分享给大家,但是剑有双刃,如若使用不当,也会伤着自己。因此在使用猴子补丁的时候,还应注意如下事项: 
1、基本上只追加功能 
2、进行功能变更时要谨慎,尽可能的小规模 
3、注意相互调用

posted @ 2017-07-30 18:33  天涯海角路  阅读(141)  评论(0)    收藏  举报