在Ruby中查找和执行方法

 更新时间:2015年07月13日 15:22:15   投稿:goldensun  
这篇文章主要介绍了在Ruby中查找和执行方法,是Ruby入门学习中的基础知识,需要的朋友可以参考下

当调用一个方法时,Ruby会做两件事。

1.找到这个方法。这个方法称为方法查找。

2.执行这个方法。为了做到这点,Ruby需要一个叫做self的东西。

这样的一个过程--发现一个方法再执行之--在每种面向对象语言中都会发生。不过,对于像Ruby这样非常动态的语言,深入理解这个过程显得尤为重要。你有没有好奇过一个方法究竟定义在哪里呢?如果有,那绝对应该深入理解方法查找及self。

当调用一个方法时,Ruby会在对象的类中查找那个方法。不过,在给出更复杂的例子之前,你需要了解两个新概念:接收者(receiver)和祖先链(ancetors chain)。

接收者就是你调用方法所在的对象。例如,在my_string.reverse()语句中,my_string就是接收者。

为了理解祖先链的概念,可以先来观察任意一个Ruby类。想象从一个类移动到它的超类,然后再移动到超类的超类,依此类推,直到到达Object类(所有类的默认超类),最后来到BasicObject类(Ruby类体系结构的根节点)。在这个过程中,你所经历的类路径就是该类的祖先链(祖先链中还可以包含模块)。

既然你已经知道什么是接受者及祖先链了,就可以用一句话来概括方法查找的过程:为了查找一个方法,Ruby首先在接受者的类中查找,然后一层层地在祖先链中查找,直到找到这个方法为止。

class MyClass
  def my_method
    my_method()
  end
end
 
class MySubclass <MyClass
end
 
obj = MySubclass.new
obj.my_method()              # =>"my_method()"

  当调用my_method()方法时,Ruby会从接收者obj出发,来到MySubclass类。由于在这里不能找到my_method()方法,Ruby向上来到MyClass类,在那里找到了这个方法。

如果在这儿也没找到这个方法,那么Ruby将会沿着祖先链向上来到Object类和BasicObject类。按照大多数人画图的顺序,这种查找行为被称为"向右一步,再向上"规则。也就是说,先向右一步来到接收者所在的类,然后沿着祖先链向上直到找到给定的方法。

到目前为止,我们只关注于如何找到方法,现在终于要来看看如何执行方法了。

设想你就是Ruby解释器。若某个人调用了一个名叫my_method()的方法,你用"向右一步,再向上"的方式找到了这个方法,你发现这个方法定义如下:
 

def my_method
  temp = @x +1
  my_other_method(temp)    
end

  为了执行这个方法,你需要回答两个问题。首先,实例变量@x属于哪个对象?其次,你应该在哪个对象上调用方法my_other_method()?

作为具有智慧的人类(而非愚蠢的计算机程序),你很可能凭直觉就能回答这两个问题:@x实例变量和my_other_method()方法都属于接收者--那个最初调用my_method()方法的对象。不过,Ruby可没有直觉,这对它来说是一个奢侈的东西。当调用一个方法时,Ruby需要持有一个接收者的引用,正是这个引用的存在,它可以记得哪个对象是接收者,再用它来执行这个方法。这个接收者引用也可以为你所用。

相关文章

  • Ruby的基本语法学习总结

    Ruby的基本语法学习总结

    这篇文章主要介绍了Ruby的基本语法学习总结,本文讲解了Ruby中的关键字、注释、数据类型、赋值和条件运算、输出和输入、条件判断语句、循环语句等内容,需要的朋友可以参考下
    2014-11-11
  • 21个你应该知道的Ruby编程技巧

    21个你应该知道的Ruby编程技巧

    这篇文章主要介绍了21个你应该知道的Ruby编程技巧,涵盖编码过程中的方方面面,需要的朋友可以参考下
    2014-06-06
  • Ruby数组(Array)学习笔记

    Ruby数组(Array)学习笔记

    这篇文章主要介绍了Ruby数组(Array)学习笔记,本文讲解了Ruby中数组的定义、数组元素的访问、数组的操作、数组的运算等内容,需要的朋友可以参考下
    2014-11-11
  • Terry七月Ruby读书笔记(比较详细)

    Terry七月Ruby读书笔记(比较详细)

    今年7月读《Ruby语言入门教程v1.0》时的读书笔记,静静地面对电脑,尝试一种新的语言,是一种淡然的快乐。
    2008-11-11
  • Ruby实现批量对文件增加前缀代码分享

    Ruby实现批量对文件增加前缀代码分享

    这篇文章主要介绍了Ruby实现批量对文件增加前缀代码分享,本文给出实现代码、使用方法、使用示例等内容,需要的朋友可以参考下
    2015-01-01
  • Ruby创建“关键字”同名方法别名的方法

    Ruby创建“关键字”同名方法别名的方法

    这篇文章主要介绍了Ruby创建“关键字”同名方法别名的方法,本文提示的是一个小技巧,特殊场景时可能会用到,需要的朋友可以参考下
    2015-01-01
  • ruby实现石头剪刀布游戏示例

    ruby实现石头剪刀布游戏示例

    这篇文章主要介绍了ruby实现石头剪刀布游戏示例,需要的朋友可以参考下
    2014-05-05
  • 详解Ruby中范围的概念

    详解Ruby中范围的概念

    这篇文章主要介绍了详解Ruby中范围的概念,需要的朋友可以参考下
    2015-05-05
  • Ruby使用设计模式中的代理模式与装饰模式的代码实例

    Ruby使用设计模式中的代理模式与装饰模式的代码实例

    这篇文章主要介绍了Ruby使用设计模式中的代理模式与装饰模式的代码实例,代理模式与装饰模式都可以归类为结构型的设计模式,需要的朋友可以参考下
    2016-03-03
  • 如何利用Ruby简单模拟Lambda演算详解

    如何利用Ruby简单模拟Lambda演算详解

    最近在学习lambda演算的相关内容,由于资料不全,学习的过程很是痛苦,下面这篇文章主要给大家介绍了关于如何利用Ruby简单模拟Lambda演算的相关资料,需要的朋友可以参考借鉴,下面来随着小编一起学习学习吧。
    2017-08-08

最新评论