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

标签 ruby

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

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/

相关文章:

ruby-on-rails - 如何在 Rails 3 项目中包含 SSL 证书

arrays - 从数组中随机选择两个不同的项目

ruby-on-rails - 事件模型 : different validation messages per view

Ruby 浮点精度

ruby - what is - gets is a directory - 错误信息

ruby - 检查字符串变量是否在一组字符串中

ruby-on-rails - 防止 Ruby 将 & 更改为 &?

ruby-on-rails - HTTP Origin header (https ://example. com) 与 request.base_url (http ://example. com) 不匹配

ruby - `Dir.entries` 中的排序顺序

ruby-on-rails - 在 rspec : `formatted_backtrace' : undefined method `backtrace' 中运行所有项目规范时出错