Ruby中的全局方法

时间:2013-03-18 19:10:52

标签: ruby

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

Ruby编程语言书(Flanagan& Matsumoto)说,如果省略该对象,则在self上调用该方法。

因此,如果此代码有效

p "123"

然后这应该工作

self.p "123"

但它没有!

在这种情况下,我在全局范围内运行它,因此self是main,self.class是Object。所以我无法在一个简单的Object实例上调用p(这很有意义)。

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

2 个答案:

答案 0 :(得分:3)

对于运行时,Ruby具有特殊对象main

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

因此,当您键入putsp等方法时,所有这些方法都在self对象的上下文中调用并传递给self对象。

这是第二件事 - 访问控制。 您可能知道,Ruby有privateprotectedpublic等关键字 - 它们都管理对象调用方法的访问。只有当你有像

这样的结构时,Ruby才会检查这个访问控制

<name_of_object>.your_methodself.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