Ruby中的方法访问

时间:2020-03-06 14:57:46  来源:igfitidea点击:

Ruby如何隐式允许类之外的类访问方法?

例子:

class Candy
    def land
        homer
    end
end

def homer
    puts "Hello"
end

Candy.new.land #Outputs Hello

解决方案

" homer"方法的定义是将该方法添加到Object类中。它没有定义自由功能。

Candy类隐式继承自Object,因此可以访问Object中的方法。当我们在" land"方法中调用" homer"时,方法解析无法在当前类中找到定义,而是转到超类,找到已添加到Object的方法,然后对其进行调用。

从技术上讲," homer"方法的定义实际上是在混合到" Object"中的" Kernel"模块上,而不是直接在" Object"上。因此,当" homer"不是局部变量或者在" Candy"上定义的实例方法时,Ruby方法继承链将通过" Object"进行跟踪,然后到达混合的" Kernel"模块,然后运行此代码。

编辑:对不起,我不知道为什么我这么想。看来该方法确实存在于"对象"上。不确定它在实践中有太大的不同,但我应该在发布之前先确认一下。

一种了解发生情况的简单方法

  • 搜索哪些类/模块来解析Candy对象中使用的方法? p Candy.ancestors#=> [Candy,Object,Kernel]
  • 糖果有叫荷马的方法吗? p Candy.instance_methods(false).grep(" homer")#=> [] p Candy.private_instance_methods(false).grep(" homer")#=> []
  • OK Candy没有任何称为" homer"的方法。
  • 查找链中的下一步(参见1)=>" Object"
  • Object是否有一种称为" homer"的方法? p Object.instance_methods(false).grep(" homer")#=> [] p Object.private_instance_methods(false).grep(" homer")#=> [" homer"]

Candy在其查找链中具有对象,而对象又具有一个私有实例方法" homer",因此方法解析成功

def语句始终在定义点本身的类中定义方法

  • 荷马定义之前的自我是什么? p self#=> main def homer将" Hello"结尾
  • 那么它的类型是什么呢? p self.class#=>对象

这就是为什么荷马最终出现在Object上的原因