给定Ruby元类,如何获取它所附加的实例?

这是问题“ Given an instance of a Ruby object,how do I get its metaclass?”的反转

您可以在认的to_s输出中看到元类或单例类附加到的对象的表示:

s = "hello"
s_Meta = class << s; self; end
s_Meta.to_s # => "#<Class:#<String:0x15004dd>>"

class C; end
c_Meta = class << C; self; end
c_Meta.to_s # => "#<Class:C>"

是否可以实现返回此对象的方法Class.attached(如果接收者是常规类,则为nil)?

s_Meta.attached # => s
c_Meta.attached # => C
C.attached # => nil

解决方法

使用ObjectSpace有一个丑陋(但仍在工作)的黑客攻击.比如,除了玩游戏和调试之外你不应该使用的东西.你只想要它的第一个(也是唯一的)实例,所以:
ObjectSpace.each_object(self).first

要确定它是否是单例类,您可以使用奇怪的属性,如果它是单例类(或本征类或魔法类),祖先将不包括其接收器:

ObjectSpace.each_object(self).first unless ancestors.include? self

如果你关心edgecases,有三个对象,它们的类也是它们的单例类.

[true,false,nil].each do |o|
   o.class.send(:define_method,:attached) { o }
 end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...