对《Ruby入门》元编程的解释

有同学表示第九章元编程的例程不好理解。先道歉,因为能力不足于游刃有余地表达元编程的方方面面,所以我选择了只演示最简单的元编程,而不展开解释。

下面给出例程的一点注释,不保证你能理解。对于入门,知道Ruby长于元编程就可以了。

ruby 代码
  1.   
  2. class MetaPerson    
  3.      
  4.   def MetaPerson.method_missing(methodName, *args)  #重新定义Ruby内置的方法method_missing    
  5.     name = methodName.to_s   
  6.     begin     
  7.               #调用Ruby内置的方法 class_eval 自动生成一个新方法   
  8.       class_eval(%Q[          
  9.       def #{name}   
  10.         puts '#{name}, #{name}, #{name}...'   
  11.       end         
  12.      ])          
  13.     rescue  
  14.               #出现异常的时候,执行Ruby原有的method_missing(methodName, *args)    
  15.       super(methodName, *args)     
  16.     end  
  17.   end  
  18.      
  19.   def method_missing(methodName, *args)         
  20.     MetaPerson.method_missing(methodName, *args) #实例method_missing调用类方法method_missing    
  21.     send(methodName)                 #使用Ruby内置的send方法,来呼叫前面自动生成的新方法   
  22.   end  
  23.      
  24.                          #下面代码类似于上面---------    
  25.   def MetaPerson.modify_method(methodName, methodBody)        
  26.     class_eval(%Q[   
  27.       def #{methodName}   
  28.         #{methodBody}   
  29.       end         
  30.      ])   
  31.   end  
  32.   
  33.   def modify_method(methodName, methodBody)       
  34.     MetaPerson.modify_method(methodName, methodBody)       
  35.   end  
  36.                         #---------------------------    
  37. end  #结束MetaPerson 类的定义   
  38.   
  39. class Person < MetaPerson     
  40. end  
  41.   
  42. person1 = Person.new  
  43. person2 = Person.new  
  44.   
  45. person1.sleep        #=> sleep, sleep, sleep...    
  46. person1.running      #=> running, running, running...    
  47.   
  48. person1.modify_method("sleep""puts 'ZZZ...'")   #修改方法sleep    
  49. person1.sleep        #=>  ZZZ...    
  50. person2.sleep        #=>  ZZZ...    
  51.   

 

这个例程有什么用呢?

假设《机械公敌》中的某一个ND5型机器人,在执行“保护人类计划”的过程中,发现微笑是很好的沟通行为,于是smile。虽然在这之前,ND5型机器人是不会smile的,但是就在某一个ND5型机器人试着smile的一瞬间,所有的ND5型机器人都可以smile了。当然,在以后的时间里,任何一个ND5型机器人都可以不断演化smile,并让其它的ND5型机器人共享smile的演化结果。


也许你不希望每一个ND5型机器人都会smile,你喜欢某一个实例对象有特立独行的行为,比如桑尼,桑尼确实与众不同,坚强,机智,谦逊(请允许我把这几个形容词用在一个机器人身上)。

为了达到你的要求,试试下面这个程序吧。

ruby 代码
  1. class Person    
  2.      
  3.   def method_missing(methodName, *args)     
  4.     name = methodName.to_s   
  5.     obj = self.inspect   
  6.     begin     
  7.       self.instance_eval(%Q[          
  8.       def #{name}   
  9.         puts '#{obj}, #{name} '   
  10.       end         
  11.      ])    
  12.       send(methodName)         
  13.     rescue  
  14.       super(methodName, *args)     
  15.     end       
  16.   end  
  17.        
  18.   def modify_method(methodName, methodBody)        
  19.     self.instance_eval(%Q[   
  20.       def #{methodName}   
  21.         #{methodBody}   
  22.       end         
  23.      ])   
  24.   end  
  25.     
  26. end  
  27.   
  28. p1=Person.new  
  29. p2=Person.new  
  30.   
  31. p1.sleep                                             #=> #<person:0x296cb14>, sleep   
  32. p1.modify_method(:sleep"puts 'This is p1 ZZZ...'")   
  33. p1.sleep                                             #=> This is p1 ZZZ...   
  34.   
  35. p2.sleep                                             #=> #<person:0x296c998>, sleep   
  36. p2.modify_method(:sleep"puts 'This is p2 ZZZ...'")   
  37. p2.sleep                                             #=> This is p2 ZZZ...   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值