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

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

发布时间:2020-12-16 21:43:32 所属栏目:百科 来源:网络整理
导读:这是问题“ Given an instance of a Ruby object,how do I get its metaclass?”的反转 您可以在默认的to_s输出中看到元类或单例类附加到的对象的表示: s = "hello"s_meta = class s; self; ends_meta.to_s # = "#Class:#String:0x15004dd"class C; endc_me
这是问题“ 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

(编辑:李大同)

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

    推荐文章
      热点阅读