如果Ruby中的所有“函数”都是方法,那么当我调用方法而没有明确提及它们被调用的对象时,它们被发送给谁?
Ruby编程语言书(Flanagan& Matsumoto)说,如果省略该对象,则在self上调用该方法。
因此,如果此代码有效
p "123"
然后这应该工作
self.p "123"
但它没有!
在这种情况下,我在全局范围内运行它,因此self是main,self.class是Object。所以我无法在一个简单的Object实例上调用p(这很有意义)。
我理解Object包含声明p的内核。解释器如何知道如何访问此声明?
答案 0 :(得分:3)
对于运行时,Ruby具有特殊对象main
。
所有代码都在此对象的上下文中运行,这是一种技巧。
因此,当您键入puts
,p
等方法时,所有这些方法都在self
对象的上下文中调用并传递给self
对象。
这是第二件事 - 访问控制。
您可能知道,Ruby有private
,protected
和public
等关键字 - 它们都管理对象调用方法的访问。只有当你有像
<name_of_object>.your_method
和self.your_method
所以当你输入
时self.p "something"
Ruby会拒绝此调用,因为p
方法是私有方法。
答案 1 :(得分:0)
这只是用户megas解释的访问问题。这个例子明确地显示了它 -
class Object
def checking
p self
end
private
def private_checking
p self
end
end
checking #=>main
self.checking #=>main
private_checking #=>main
self.private_checking #=>NoMethodError