【问题标题】:Global methods in Ruby [duplicate]Ruby中的全局方法[重复]
【发布时间】:2013-03-18 19:10:52
【问题描述】:

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

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

如果这段代码有效

p "123"

那么这应该可以工作

self.p "123"

但它没有!

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

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

【问题讨论】:

  • 该方法是私有的。见stackoverflow.com/questions/4293215/…
  • 您真的阅读了错误信息吗?它非常清楚地解释了正在发生的事情。
  • 从 NoMethodError 中很难猜到它是被调用的同一个对象并且该方法是私有的。此外,Ruby 的私有方法方法对于 Ruby 初学者来说并非易事,尤其是在使用过 Java、C++ 等之后
  • 对不起,你是对的,它确实说调用了私有方法。我正在使用 Netbeans,是的,我什至没有阅读整行内容。愚蠢的:(

标签: ruby


【解决方案1】:

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

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

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

这是第二件事 - 访问控制。 您可能知道,Ruby 有诸如privateprotectedpublic 之类的关键字——它们都管理对象上调用方法的访问。 Ruby 仅在您有类似

的构造时才检查此访问控制

<name_of_object>.your_methodself.your_method

所以当你打字时

self.p "something"

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

【讨论】:

  • 谢谢,您的回答让我完全理解了这个问题。我发布了一个明确的例子
【解决方案2】:

正如用户 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2017-05-13
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2020-05-23
    相关资源
    最近更新 更多