`
任清宇
  • 浏览: 21646 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ruby 元编程 第二版随笔(二)

    博客分类:
  • ruby
阅读更多

 

 

  调用方法时发生了什么? 

  What happens when you call a method?

 

      调用方法时Ruby会做两件事:

     (1)找到这个方法,这个过程成为方法查找。

   (2)执行这个方法,为了做到这点,ruby要用到一个称为self 的东西。

       

    1.方法查找

         Method lookup

         

      调用一个方法前,Ruby会在对象中查找那个方法。不过,在进一步学习之前,我们还要掌握两个新概念:接受者(receiver)和祖先链(ancestors chain)。接受者就是你调用方法所在的对象。例如,在my_string.reverse()语句中,my_string就是接收者。为了理解祖先链 的概念,可以先观察一个Ruby类。想像从一个类找到它的超类,然后依次往上找,直到找到basicObject(Ruby类体系结构的根节点)。在这个过程中,经历的类的路径就是该类的祖先链。(祖先链中可能会包含模块,后面再说。)

       知道了接收者和祖先链,就可以用一句话来概括方法查找的过程:Ruby首先在接收者的类中查找。然后顺着祖先链向上查找,直到找到这个方法为止。

       

class MyClass
  def my_method; 'my_method'; end
end

class MySubclass < MyClass
end

   

 obj = MySubclass.new
 obj.my_method()                #   => "my_method()"

  

           我们已经知道了祖先链是从类开始到其超类结束。 实际上,祖先链中也包含模块(module)。当吧一      个模块包含在一个类(或者一个模块)中时,Ruby就会把这个模块加入该类的祖先链中,该模块在祖先链      中的位置就在包含它的类之上。

   

module M1
  def my_method
    'M1#my_method()'
  end
end

class C
  inculde M1
end

class D < C; en   

 D.ancestors            #  =>  [D, C, M1, Object, Kernel, BasicObject] 

 

 

          从Ruby 2.0 开始,还可以用另外一种方法吧模块插入一个类的祖先链中:使用prepend方法。 他的功能和include方法相似, 不过这个方法会把模块插入到祖先链中包含它的该类的下方,而不像include方法那样插入上方:

   

class C2
  prepend M2
end

class D2 < C2; end

  

   

D2.ancestors                #   =>  [D2, M2, C2, Object, Kennel, BasicObject]

 

 

    关于include和prepend,还有一个重要的知识点。

 

   多重包含

 

   如果试图在某个类的祖先链中多次加入同一个模块,会如何呢?

 

module M1; end

module M2
  include M1
end

module M3
  prepend M1
  inculde M2
end

   

M3.ancestors        #  => [M1, M2, M3]

 

 

          可以看出虽然我们多次的添加模块但是最后并没有重复,每次include或者prepend的时候,如果该模块 已经存在于祖先链中, 那么Ruby会悄悄的忽略这个包含(include或prepend)指令。因此一个模块只会在一条祖先链中出现一次。

 

    无处不在的Kernel模块

 

    Ruby中有一些方法(如print)可以随时随地的进行调用,看起来就像是所有对象都有print方法一样。这是因为这些方法实际上都是kerenl模块的私有方法:

 

Kernel.pricate_instance_methods.grep(/^pr/) # => [:printf, :print, :proc]

 

 

        这里的秘密在于Object类包含了Kernel模块,因此Kernel模块就进入了每个对象的祖先链。于是,无论哪个对象都可以随意调用Kernel模块的方法。这使得print看起来就像一个关键字,其实它只是一个方法而已。 

分享到:
评论

相关推荐

    Ruby元编程第二版中文

    这本书“Ruby元编程第二版”专注于讲解Ruby语言的这一独特特性,旨在帮助开发者更好地理解和利用Ruby的元编程能力。 元编程的基本概念是程序能够自省、修改自身或者在运行时生成新的代码。在Ruby中,元编程的强大之...

    ruby元编程.pdf

    ruby元编程.pdf ruby 元编程 这本书对ruby的调用原理做了非常精辟的分析。 ruby 元编程 这本书对ruby的元编程方式做了比较好的阐释。 ruby 元编程 这本书对结对编程有一个很好的提现。

    《Ruby元编程》PDF版本下载.txt

    ### 二、元编程在Ruby中的应用 #### 2.1 动态构建代码 在Ruby中,可以通过`eval`函数来执行字符串形式的代码,这种方式常用于动态构建代码块。例如,在某些框架中,可以根据用户输入动态生成表单字段或视图组件。 ...

    Ruby元编程 第2版 中文 佩罗塔著 2015.08

    ruby元编程 第2版 中文 目录清晰 方便广大通勤族路上看,如果喜欢请购买正版纸质图书

    Ruby元编程中文版

    Ruby元编程中文版

    Ruby元编程pdf

    Ruby元编程是编程的一种高级技巧,它允许程序员在运行时动态地修改或创建代码,极大地提高了灵活性和代码的可扩展性。Ruby作为一种动态类型语言,其元编程能力尤为强大,使得开发者可以创建出高度定制化的解决方案。...

    Ruby元编程-中文

    ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开...

    Ruby元编程【英文版】

    #### 二、《Ruby元编程》书籍简介与评价 《Ruby元编程》是一本以案例驱动的方式介绍Ruby元编程技巧的书籍。书中不仅详细解析了Ruby语言的核心特性和元编程机制,还通过具体的例子展示了如何利用这些特性编写简洁、...

    programming+ruby中文版第二版

    《Programming Ruby中文版第二版》是一本专注于Ruby编程语言的权威指南,对于想要深入学习和理解Ruby编程的读者来说,是一本不可多得的资源。Ruby作为一种动态、面向对象的编程语言,以其简洁、优雅的语法和强大的元...

    Ruby 元编程

    Ruby 一种面向对象程序设计的脚本语言 本书的第一部分“Ruby元编程”是本书的核心部分...本书的第二部分“Rails中的元编程”是一个元编程实例,Rail是Ruby标志性框架。 在阅读本书之前,需要了解本书的三个附录 A、B、C

    元编程 Ruby

    在Ruby这种动态编程语言中,元编程是一种核心技术,它不仅仅是一种技巧,更是Ruby和Rails框架中用于提高开发效率和软件复用性的关键方法。 在Ruby语言中,元编程主要通过方法拦截、动态方法定义、元类以及一些特殊...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    Ruby元编程是编程领域中的一个高级技术,它允许程序员在运行时操纵语言的结构和行为。这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源...

    ruby元编程

    《Ruby元编程》以案例形式循序渐进地介绍了Ruby特有的实用编程技巧 元编程 通过分析案例 讲解例题 回顾Ruby代码库的实现细节 《Ruby元编程》作者Paolo Perrotta不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题...

    Metaprogramming Ruby 2nd Edition ruby元编程

    ### Metaprogramming Ruby 2nd Edition:深入理解Ruby元编程 #### 一、书籍简介与价值 《Metaprogramming Ruby 2nd Edition》是一本深入探讨Ruby语言元编程特性的经典之作。本书不仅适合那些希望深入了解Ruby内部...

    Programming Ruby中文版(第二版)

    本书是它的第2版,其中包括超过200页的新内容,以及对原有内容的修订,涵盖了Ruby 1.8中新的和改进的特性以及标准库模块。它不仅是您学习Ruby语言及其丰富特性的一本优秀教程,也可以作为日常编程时类和模块的参考...

    Ruby 元编程 中文 高清扫描版

    Ruby 元编程 中文 高清扫描版, 完整中文版

    Ruby元编程_第2版 ,佩罗塔著--廖志刚-翻译

    Ruby元编程_第2版 ,佩罗塔著--廖志刚-翻译 中文高清扫描,带详细目录标签,值得一睹。 另外友情推荐下载:1、《ruby原理剖析》-张汉东-翻译,必看书籍。 2、《优雅的Ruby》-张汉东-翻译,看看有好处。 张汉东,...

Global site tag (gtag.js) - Google Analytics