调用方法时发生了什么?
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元编程 第2版 中文 目录清晰 方便广大通勤族路上看,如果喜欢请购买正版纸质图书
ruby元编程.pdf ruby 元编程 这本书对ruby的调用原理做了非常精辟的分析。 ruby 元编程 这本书对ruby的元编程方式做了比较好的阐释。 ruby 元编程 这本书对结对编程有一个很好的提现。
### 二、元编程在Ruby中的应用 #### 2.1 动态构建代码 在Ruby中,可以通过`eval`函数来执行字符串形式的代码,这种方式常用于动态构建代码块。例如,在某些框架中,可以根据用户输入动态生成表单字段或视图组件。 ...
Ruby元编程中文版
Ruby元编程是编程的一种高级技巧,它允许程序员在运行时动态地修改或创建代码,极大地提高了灵活性和代码的可扩展性。Ruby作为一种动态类型语言,其元编程能力尤为强大,使得开发者可以创建出高度定制化的解决方案。...
ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开...
#### 二、《Ruby元编程》书籍简介与评价 《Ruby元编程》是一本以案例驱动的方式介绍Ruby元编程技巧的书籍。书中不仅详细解析了Ruby语言的核心特性和元编程机制,还通过具体的例子展示了如何利用这些特性编写简洁、...
《Programming Ruby中文版第二版》是一本专注于Ruby编程语言的权威指南,对于想要深入学习和理解Ruby编程的读者来说,是一本不可多得的资源。Ruby作为一种动态、面向对象的编程语言,以其简洁、优雅的语法和强大的元...
Ruby 一种面向对象程序设计的脚本语言 本书的第一部分“Ruby元编程”是本书的核心部分...本书的第二部分“Rails中的元编程”是一个元编程实例,Rail是Ruby标志性框架。 在阅读本书之前,需要了解本书的三个附录 A、B、C
在Ruby这种动态编程语言中,元编程是一种核心技术,它不仅仅是一种技巧,更是Ruby和Rails框架中用于提高开发效率和软件复用性的关键方法。 在Ruby语言中,元编程主要通过方法拦截、动态方法定义、元类以及一些特殊...
Ruby元编程是编程领域中的一个高级技术,它允许程序员在运行时操纵语言的结构和行为。这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源...
《Ruby元编程》以案例形式循序渐进地介绍了Ruby特有的实用编程技巧 元编程 通过分析案例 讲解例题 回顾Ruby代码库的实现细节 《Ruby元编程》作者Paolo Perrotta不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题...
### Metaprogramming Ruby 2nd Edition:深入理解Ruby元编程 #### 一、书籍简介与价值 《Metaprogramming Ruby 2nd Edition》是一本深入探讨Ruby语言元编程特性的经典之作。本书不仅适合那些希望深入了解Ruby内部...
本书是它的第2版,其中包括超过200页的新内容,以及对原有内容的修订,涵盖了Ruby 1.8中新的和改进的特性以及标准库模块。它不仅是您学习Ruby语言及其丰富特性的一本优秀教程,也可以作为日常编程时类和模块的参考...
Ruby 元编程 中文 高清扫描版, 完整中文版
Ruby元编程_第2版 ,佩罗塔著--廖志刚-翻译 中文高清扫描,带详细目录标签,值得一睹。 另外友情推荐下载:1、《ruby原理剖析》-张汉东-翻译,必看书籍。 2、《优雅的Ruby》-张汉东-翻译,看看有好处。 张汉东,...
松本行弘原著,Ruby编程入门非常好的书籍。共两个文件