It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center
6年前关闭。
我正在用方法foo编写一个模块,它调用接收方类上的类方法bar我目前的方法是使用self.class.bar,除非类方法是在实例类而不是“real”类中定义的,否则它可以正常工作:

module M
  def foo
    self.class.bar
  end
end

obj = Object.new
class << obj
  include M
  def self.bar
    42
  end
end

obj.foo # => NoMethodError: undefined method `bar' for Object:Class

这是有意义的,因为obj.class不返回单例类。我可以用obj.singleton_class代替,一切都会顺利进行:
module M
  def foo
    self.singleton_class.bar
  end
end

obj = Object.new
class << obj
  include M
  def self.bar
    42
  end
end

obj.foo # => 42

仅当该方法是基于与上述相同的原因在单例类上定义的更糟糕的是,它为每个接收者创建了一个新的单例类,这是我要避免的,因为这些对象可能相当多。因此,我想用某种方法来检索对象的singleton类,如果且仅当它已经被定义,即obj.has_singleton_class ? obj.singleton_class : obj.class类型的类但是我找不到任何方法来做这个检查。

最佳答案

在ruby中,每个对象都有一个singleton类。您使用的特定实现(MRI、YARV、Rubinius、JRuby、IronRuby、MacRuby、MagLev、MRuby等)可能不会通过不为未使用的单例类分配内存来优化内存使用,但这是一个私有的内部实现细节,一个不可见的透明编译器优化无论何时你去寻找一个单身班,它都会在那里。
嗯,事实上,这不是真的立即值,即Integers,Symbols和Floats不能有单值类。
所以,这三个永远不会有一个单一的类,所有其他的总是有一个单一的类。

关于ruby - 检查对象是否具有单例类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16501353/

10-10 15:23