3

如果 Ruby 中的所有“函数”都是方法,那么当我调用方法而不明确提及调用它们的对象时,它们会发送给谁?

Ruby Programming Language book (Flanagan & Matsumoto) 说如果对象被省略,方法会在 self 上调用。

所以如果这段代码有效

p "123"

那么这应该工作

self.p "123"

但它没有!

在这种情况下,我在全局范围内运行它,所以 self 是 main 并且 self.class 是 Object。所以我不能在一个简单的 Object 实例上调用 p (这是有道理的)。

我知道 Object 包括声明 p 的内核。解释器如何知道如何访问此声明?

4

2 回答 2

3

对于运行时 Ruby 有特殊的对象main.

所有代码都在这个对象的上下文中运行是一种技巧。

因此,当您键入诸如 之类的方法时putsp它们都在self对象的上下文中调用并传递给self对象。

这是第二件事——访问控制。你可能知道,Ruby 有private,protectedpublic- 之类的关键字,它们都管理对象上调用方法的访问。Ruby 仅在您进行类似的构造时才检查此访问控制

<name_of_object>.your_methodself.your_method

所以当你打字的时候

self.p "something"

Ruby 将拒绝此调用,因为该p方法是私有方法。

于 2013-03-18T19:22:13.073 回答
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
于 2013-03-18T20:05:27.547 回答