gpt4 book ai didi

ruby - 如何在不创建对象的情况下检查对象是否具有单例类(eigenclass)

转载 作者:数据小太阳 更新时间:2023-10-29 06:33:34 27 4
gpt4 key购买 nike

有没有一种方法可以在不创建对象的情况下检查对象是否具有单例类?

Check if an object has a singleton class 中所述的除外,并非每个对象都有一个单例类(参见 https://repl.it/DuVJ/2 下的证明)。

我想到了以下方法,但行不通:

  1. obj.singleton_class

    如果不存在,这会自动创建一个新的单例类(参见 https://ruby-doc.org/core-1.9.2/Object.html#method-i-singleton_class ).

  2. 使用对象空间:

    has_singleton_class = ObjectSpace.each_object(Class).any? do |klass|
    klass < self.class && klass.singleton_class? && self.is_a?(klass)
    end

    这很慢,在 jRuby 下可能无法工作,因为 ObjectSpace 可能不会有空。

  3. obj.singleton_methods 只有在单例类至少有一种方法。

最佳答案

您可以使用ancestors 方法。因为你想检查一个类(而不是一个对象)是否是单例,你可以获取类中混合的所有模块并验证其中是否有任何一个是单例类。

class Klass
include Singleton
end

Klass.ancestors.include? Singleton # true

在 ruby​​ 中,为了创建单例,您应该包含一个 Singleton 模块。因此,如果您检查该模块,则意味着该类是单例。 Ruby 的模块类的基类继承意味着您可以使用 ancestors 方法。

引用资料:

  1. https://ruby-doc.org/core-2.1.0/Module.html#method-i-ancestors
  2. https://ruby-doc.org/core-2.2.0/Class.html
  3. https://ruby-doc.org/stdlib-2.1.0/libdoc/singleton/rdoc/Singleton.html#module-Singleton-label-Usage

关于ruby - 如何在不创建对象的情况下检查对象是否具有单例类(eigenclass),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40002927/

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