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等)可能不会通过不为未使用的单例类分配内存来优化内存使用,但这是一个私有的内部实现细节,一个不可见的透明编译器优化无论何时你去寻找一个单身班,它都会在那里。
嗯,事实上,这不是真的立即值,即Integer
s,Symbol
s和Float
s不能有单值类。
所以,这三个永远不会有一个单一的类,所有其他的总是有一个单一的类。
关于ruby - 检查对象是否具有单例类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16501353/