gpt4 book ai didi

ruby - 类如何调用在单例类上定义的类方法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:55 26 4
gpt4 key购买 nike

我继续研究 Ruby,然后又想到了另一个问题。我知道当我们在一个类上定义一个类方法时,它会创建一个单例类来获取该方法的定义,从那时起,该方法就是该单例类的实例方法(我从测试中得出这个结论,但是我可能是错的,请随时纠正我)。

我的问题是,如果方法是在单例类上定义为该类的实例方法,我如何使用 X.classMethod 在类 X 上调用类方法(我不是问我该怎么做。它是发生了什么。)。这让我更加困惑,因为我注意到(运行一些测试)一个类的单例类甚至与它来自的类在层次结构上都不相关,那么,类方法调用如何解析为单例类?更准确地说:类如何在没有任何实例的实例方法的单例类上调用方法。

希望我没有把你搞糊涂

再次感谢您。

最佳答案

我将从以下示例开始:

class Foo
def self.bar
puts 12
end
end

Foo.singleton_methods # => [:bar]
Foo.ancestors # => [Foo, Object, Kernel, BasicObject]

在 Ruby 中,类也是对象。现在这里#barFoo 的单例方法.当你做了 Foo.bar , Foo首先在其单例类中搜索,然后向上搜索祖先链单例类singleton class 是一种幽灵类,因此它在祖先链中不可见,但它存在。它隐藏在 Foo.ancestors 的输出中语言设计者故意的。 单例方法 由对象(此处为 FOO)直接调用,在该对象上创建了单例(每个对象基础类)类。 您不能创建单例类的实例。

这是一个证明:

Foo.singleton_class.new # can't create instance of singleton class (TypeError)

还请记住类的单例方法在这里说 Bar , 也可用于其后代类(此处为 Foo )。因为 Bar 的元类成为了 Foo 的元类的父类(super class) , 当你写 class Foo < Bar.. .

class Bar
def self.biz
puts 11
end
end

class Foo < Bar
def self.bar
puts 12
end
end

Bar.singleton_class # => #<Class:Bar>
Foo.singleton_class.superclass # => #<Class:Bar>

关于ruby - 类如何调用在单例类上定义的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com