加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:58:03 所属栏目:百科 来源:网络整理
导读:有没有一种检查对象是否具有单例类而不创建单个类的方法? 除了Check if an object has a singleton class之外,每个物件都不具有单身类(参见https://repl.it/DuVJ/2证明). 以下方法进入我的脑海,但不行: obj.singleton_class 如果没有,则自动创建一个新的单
有没有一种检查对象是否具有单例类而不创建单个类的方法?

除了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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读