ruby define_method


可以利用Module#define_method( )方法定义一个方法,只需要为其提供一个方法名和一个充当方法主体的块即可。


例1:  define_method方法在MyClass内部执行,所以add方法定义为MyClass的实例方法。

  1. class MyClass  
  2.         define_method :add do |args|  
  3.                 args * 3  
  4.         end  
  5. end  
  6.   
  7. obj = MyClass.new  
  8. result = obj.send(:add,3)  
  9. puts result #=>9  

  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  
  10. c.send(:show)  

method_missing方法。

  1. class MyOpenStruct  
  2.         def initialize  
  3.                 @attr = {}  
  4.         end  
  5.   
  6.   
  7.         def method_missing(name,*args)  
  8.                 puts "you called: #{name}"  
  9.                 attr = name.to_s  
  10.                 if attr =~ /=$/  
  11.                         @attr[attr.chop] = args[0]  
  12.                 else  
  13.                         @attr[attr]  
  14.                 end  
  15.         end  
  16. end  
  17.   
  18. i = MyOpenStruct.new  
  19. i.flavor = "hello"  #先调用flavor=方法  
  20. puts i.flavor  #=> hello   后调用flavor方法  

  1. class Roulette  
  2.         def method_missing(name,*args)  
  3.                 person = name.to_s.capitalize  
  4.                 num = 0  
  5.                 3.times do  
  6.                         num = rand(10)+1  
  7.                         puts "#{num}...."  
  8.                 end  
  9.                 "#{person} get a #{num} "  
  10.         end  
  11. end  
  12.   
  13. obj = Roulette.new  
  14. puts obj.bob  
  15. puts obj.frank  

ruby的作用域
  1. v1 = 1  
  2. class MyClass  
  3.         v2 = 2  
  4.         puts local_variables  
  5.   
  6.         def my_method  
  7.                 v3 = 3  
  8.                 puts local_variables  
  9.         end  
  10.   
  11.         puts local_variables  
  12. end  
  13.   
  14. obj = MyClass.new  
  15. obj.my_method  
  16. obj.my_method  
  17. puts local_variables  
  18.   
  19. #输出:v2  v2  v3  v3  v1 obj  

考虑下面一个问题?

怎样让一个变量穿过不同的作用域?

  1. my_var = "success"  
  2. class MyClass  
  3.          #希望在这里显示my_var  
  4.         def my_method  
  5.               #希望在这里显示my_var  
  6.         end  
  7. end  

实现方法:扁平作用域。如果使用方法来替代作用域的门,那么可以让一个作用域看到另一个作用域中的变量。
  1.  var = "success"  
  2.   
  3. MyClass = Class.new do  
  4.         puts "#{var} in class definition!"  
  5.   
  6.         define_method :my_method do  
  7.                 puts "#{var} in method"  
  8.         end  
  9. end  
  10.   
  11. obj = MyClass.new  
  12. obj.my_method  

共享作用域
  1. def my_method  
  2.         shared = 0  
  3.   
  4.         Kernel.send :define_method:counter do  
  5.                 shared  
  6.         end  
  7.   
  8.         Kernel.send :define_method:inc do |x|  
  9.                 shared += x  
  10.         end  
  11. end  
  12.   
  13. my_method  
  14.   
  15. puts counter  
  16. inc(4)  
  17. puts counter 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值