【问题标题】:ruby, kernel module methods documentationruby,内核模块方法文档
【发布时间】:2015-01-04 15:24:57
【问题描述】:

Ruby Kernel module 文档中的这件事让我很困惑。

据我了解,Kernel 模块包含在 Object 类中。
这样做会使它的所有实例方法都像 Object 的方法一样,因此,任何其他类的方法也是如此。
到现在为止还挺好;然后文档指出:

The Kernel instance methods are documented in class Object while the module methods are documented here

好的。但是话又说回来,所有方法都属于以下部分:

Public Instance Methods

sprintflambdaloadloop 这样的方法在我看来显然是类方法,而不是实例方法,即使它们是“在没有接收者的情况下调用”。
但这不可能是正确的,因为将它们呈现为实例方法有一定的一致性。在左侧的方法框中,它们使用“实例方法约定”调用,即#some_method。 那么这是为什么呢?它们是实例还是其他?如果它们是实例方法,它们与哪个实例相关?

【问题讨论】:

    标签: ruby module


    【解决方案1】:

    Object 类本身就是一个对象。当 Kernel 包含在 Object 中时,它的实例方法变成 Object 的实例方法,同时也是 Object 对象的实例方法(也就是 Object 的类方法)。是的,这意味着对象Object 在其类的祖先链中有Object

    Object.class.ancestors # => [类、模块、对象、内核、基本对象]

    【讨论】:

    • 所以你的意思是,他们不是将这些方法称为“类方法”,而是将它们称为类的类对象的实例方法?
    • 没错!当你想定义一个“类方法”时,你必须做类似def self.foo的事情,这实际上是在实例self中添加一个方法foo
    • 但是它在文档中的什么地方这么说呢?它们似乎只是常规的实例方法,而不是“self”类的实例方法,不是吗?
    • 实例方法是 Ruby 仅有的方法。 Way 可能谈论类方法,但这些实际上只是类Class 的实例方法,其中所有类都是实例。或者它们是类的单例方法。但实际上,也没有单例方法,它们只是对象的单例类的常规实例方法。因此,当我们说“类方法”时,我们实际上是指“Class 或其任何超类(ModuleObjectKernelBasicObject)的实例方法,或者我们的意思是“类的单例类”。
    • 好的。谢谢你的澄清。以及这如何应用于内核模块?将它包含到object类中,使得它的方法是Object的实例方法,而不是Object类的实例方法,所以是Object类的方法,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2021-07-16
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多