Ruby中的方法访问
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”时,方法解析在当前类中找不到定义,
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顶级对象的详细说明,请参阅或。