给定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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |