ruby – 如何检查对象是否具有单例类(特征类),而不创建一个

前端之家收集整理的这篇文章主要介绍了ruby – 如何检查对象是否具有单例类(特征类),而不创建一个前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有一种检查对象是否具有单例类而不创建单个类的方法

除了Check if an object has a singleton class之外,每个物件都不具有单身类(参见https://repl.it/DuVJ/2证明).

以下方法进入我的脑海,但不行:

> obj.singleton_class

如果没有,则自动创建一个新的单例类(参见
https://ruby-doc.org/core-1.9.2/Object.html#method-i-singleton_class).
>使用ObjectSpace:

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

这很慢,可能无法在jRuby下工作,因为ObjectSpace可能不会
能得到的.
> obj.singleton_methods仅在单例类至少有效的情况下才起作用
一种方法.

解决方法

您可以使用祖先方法.因为你想检查一个类(而不是一个对象)是一个单例,你可以获取类中混合的所有模块,并验证其中的任何一个是单例类.
class Klass
  include Singleton
end

Klass.ancestors.include? Singleton # true

在红宝石中,要创建一个单例,您应该包含一个Singleton模块.所以如果你检查该模块,这意味着该类是一个单例. Ruby的基类继承的模块类意味着你有权使用祖先的方法.

参考文献:

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

原文链接:https://www.f2er.com/ruby/272344.html

猜你在找的Ruby相关文章