有没有一种检查对象是否具有单例类而不创建单个类的方法?
除了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