Ruby中的方法访问

Ruby中的方法访问,ruby,methods,Ruby,Methods,Ruby是如何允许类隐式地访问类之外的方法的 例如: class Candy def land homer end end def homer puts "Hello" end Candy.new.land #Outputs Hello “homer”方法的定义是将该方法添加到对象类中。它不是定义一个自由函数 类Candy隐式继承自Object,因此可以访问Object中的方法。在“land”方法中调用“homer”时,方法解析在当前类中找不到定义,

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

例如:

class Candy
    def land
        homer
    end
end

def homer
    puts "Hello"
end

Candy.new.land #Outputs Hello
“homer”方法的定义是将该方法添加到对象类中。它不是定义一个自由函数

类Candy隐式继承自Object,因此可以访问Object中的方法。在“land”方法中调用“homer”时,方法解析在当前类中找不到定义,转到超类,找到添加到对象中的方法并调用它。

从技术上讲,
homer
方法的定义实际上在
内核
模块上,该模块与
对象
混合在一起,不直接在
对象上。因此,当
homer
不是一个局部变量或
Candy
上定义的实例方法时,Ruby方法继承链将通过
Object
进行跟踪,然后进入混合的
内核
模块,然后运行此代码


编辑:对不起,我不知道我为什么这么想。似乎该方法确实存在于
对象上
。我不确定这在实践中会有多大的不同,但我应该在发帖前确认一下。

一个简单的方法来找出发生了什么

  • 搜索哪些类/模块来解析Candy对象中使用的方法

    p Candy.祖先#=>[糖果,对象,内核]

  • 糖果有叫荷马的方法吗

    p Candy.instance_methods(false).grep(“荷马”)35;=>[]

    p Candy.private_实例_方法(false).grep(“荷马”)35;=>[]

  • OK Candy没有任何称为“荷马”的方法

  • 查找链中的下一步是什么(请参见1)=>“对象”

  • 对象是否有一个名为“homer”的方法? p Object.instance_methods(false).grep(“荷马”)#=>[]

    p Object.private_instance_methods(false).grep(“homer”)#=>[“homer”]

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

    def语句总是在类中定义self处于定义点的方法

  • 在荷马被定义之前,什么是自我

    p self#=>main def荷马 “你好” 结束

  • 那么它是什么类型的呢

    p self.class#=>对象


  • 这就是为什么荷马在Object上结束了,Ruby没有自由浮动函数。每个方法都属于某个对象。您在顶层定义的方法实际上正在成为类
    对象的实例方法。因为在某种程度上,一切都是一个
    对象
    ,所以所有对象都可以访问
    对象
    的实例方法。

    请参阅下面我的说明。。。它是在内核模块上定义的,而不是对象类。从技术上讲,你错了,它是在
    Object
    上定义的,而不是在
    Kernel
    方法(:homer)上定义的。owner=>Object
    有关Ruby顶级对象的详细说明,请参阅或。