`
凌川__
  • 浏览: 84066 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

对《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...   
  38.   
分享到:
评论

相关推荐

    Ruby编程语言入门与实践 .pptx

    Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门...

    Ruby入门教程中文PDF 附实例

    总之,无论你是对编程感兴趣的新手,还是想扩展技能树的开发者,这份“Ruby入门教程中文PDF 附实例”都将是你宝贵的参考资料。通过学习,你不仅可以掌握Ruby的基础知识,还能体验到编程的乐趣和效率。

    Ruby元编程【英文版】

    1. **对象模型与类的动态行为**:Ruby的对象模型非常灵活,本书详细解释了如何利用这一特点进行元编程。例如,可以通过定义方法的缺省行为来简化代码,或者通过动态添加方法来扩展类的功能。 2. **闭包与块**:闭包...

    ruby入门到精通

    这本书“Ruby入门到精通”显然旨在引导初学者逐步掌握Ruby语言。以下是一些关键知识点,它们可能是书中涉及的内容: 1. **基础语法**:包括变量(本地、实例、类和全局变量)、常量、符号、字符串、数字、数组和...

    Ruby相关入门教程网址

    总的来说,这份Ruby入门教程应该能帮助初学者建立起对Ruby语言的全面认识,从基础语法到高级特性,再到实际开发中的工具使用,为进入Ruby世界提供了一条清晰的学习路径。通过深入学习和实践,读者将能够运用Ruby进行...

    ruby入门书籍

    《Ruby入门书籍》可能是一本详细介绍Ruby编程语言的基础教程。根据提供的文件名,我们可以推测这本书籍可能包含了两个部分:中文文档和"The Ruby Way"的翻译或解读。 "ruby中文文档.chm"可能是对Ruby语言的中文详细...

    Ruby 教程 从入门到精通

    Ruby的诞生源自松本行弘对现有编程语言的不满,他希望创造一种既具有动态类型系统的灵活性,又能体现面向对象编程思想的语言。1995年,Ruby的第一个公开版本发布,自那时起,它逐渐在全球范围内获得了开发者社区的...

    Ruby语言入门教程v1.0

    《Ruby语言入门教程v1.0》不仅仅是一本技术手册,它还蕴含着作者对编程的热爱和对知识传播的承诺。通过系统地学习教程中的内容,初学者可以迅速掌握Ruby语言的基本技能,为进一步探索更高级的主题打下坚实的基础。...

    ruby入门简单demo,学习练习编程语言

    4. 元编程:Ruby允许在运行时修改代码,包括定义方法、类和模块,这使得元编程变得非常强大且容易实现。 5. blocks和proc:Ruby中的块(block)是代码的可重用部分,类似于其他语言的匿名函数。Proc是存储块的可...

    Ruby多线程编程初步入门

    ### Ruby多线程编程初步入门 #### 一、引言 多线程编程是现代软件开发中的重要组成部分,尤其对于需要高效并发处理的任务而言更是如此。Ruby作为一种灵活且功能强大的编程语言,在支持多线程方面提供了丰富的工具...

    Ruby从入门到精通pdf

    - Ruby的元编程能力强大,可以在运行时修改类和对象的行为。 - eval()函数可以执行字符串形式的代码,define_method动态定义方法。 7. **Rails框架**: - Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC...

    Ruby编程,Ruby编程,

    4. **元编程能力**:Ruby允许开发者在运行时修改类的行为,这种灵活性使得Ruby非常适合于快速开发和原型制作。 5. **强大的标准库**:Ruby拥有一个非常强大且全面的标准库,这为开发者提供了大量的内置功能,从而...

    Ruby编程入门与高级特性实战详解

    适合人群:对Ruby编程感兴趣的初学者以及希望深入了解Ruby高级特性的开发者。 使用场景及目标:帮助读者掌握Ruby语言的基本用法和常见数据类型的处理方法,提高解决实际问题的能力;同时通过高级特性和实战案例,...

    以下是一个完整的 Ruby 入门教程,帮助你快速了解和上手 Ruby 编程

    Ruby 是一种简单、面向对象的动态编程语言,广泛应用于 Web 开发和脚本编程(例如 Ruby on Rails)。它以简洁、易读的语法设计为目标,非常适合...以下是一个完整的 Ruby 入门教程,帮助你快速了解和上手 Ruby 编程。

    Ruby Ruby入门级实例

    Ruby入门级实例

    二十分钟Ruby入门教程

    总之,二十分钟的Ruby入门教程将带你初步了解这个优雅的编程语言。虽然短短的时间无法让你精通所有细节,但足以激发你进一步探索Ruby世界的兴趣。从基本语法到面向对象编程,Ruby提供了一种直观且富有表达力的方式来...

    Ruby从入门到精通

    《Ruby从入门到精通》是一本彻底而全面的最新指南,适合于各类Ruby读者,不管是编程初学者、Web开发人员,还是Ruby新手。《Ruby从入门到精通》从解说面向对象编程背后的原理开始,只通过几章的讲解,就构造出了真正...

Global site tag (gtag.js) - Google Analytics