【发布时间】:2018-05-11 07:12:55
【问题描述】:
我已阅读有关此主题的 stackoverflow 帖子以及包括 A Primer on Ruby Method Lookup、What is the method lookup path in Ruby 在内的几篇文章。另外,我查看了Ruby Metaprogramming 2中的对象模型章节,在几个聊天室中询问,并发了this reddit thread。由于没有学习 C,我已经尽我所能来解决这个问题。
如上述资源所述,这 6 个位置在对接收对象(如fido_instance)进行方法查找期间被检查(按顺序):
- fido_instance 的单例类
- IClass(来自扩展模块)
- IClass(来自前置模块)
- 类
- IClass(来自包含的模块)
- 超类(如果此处未找到方法,请重复步骤 4-6)
显然,图表是不完整的,所有这些单例类可能都不是在现实世界中创建的。尽管如此,这 6 个步骤仍有很多不足之处,并且不包括以下场景。如果在fido_instance 的单例类之上没有扩展/前置IClass,则没有说明步骤4 是否在fido_instance 的单例类上执行。我必须假设不会,因为整个方法查找会短路。
如果我猜测一组可以解释 ruby 的方法查找行为的步骤,它可能看起来像:
- 检查
fido_instance.class的方法。 (显然,ruby 不会使用自己的#class 方法来进行方法查找,但它传达了过程的逻辑) - 检查
fido_instance.class.superclass的方法。继续添加.superclass并检查该方法,直到没有剩余超类。 (同样,ruby 不会使用自己的#superclass 方法) - 未找到方法。从第 1 步开始,这次寻找#method_missing。
我还记得读过,如果接收对象是一个类,则有一个单独的方法查找过程,但我不记得在哪里。
那么,不涉及了解 C 的正确、详细的解释是什么?
【问题讨论】:
-
从实例的角度来看,它本质上是 singleton_method -> 前置模块方法 -> 实例方法 -> 包含模块方法 -> 超类实例方法(递归到基本对象)
标签: ruby object-model