给定一个 Ruby 对象的实例,我如何获得它的元类?
Posted
技术标签:
【中文标题】给定一个 Ruby 对象的实例,我如何获得它的元类?【英文标题】:Given an instance of a Ruby object, how do I get its metaclass? 【发布时间】:2011-02-26 02:42:21 【问题描述】:通常,我可能会通过以下方式获取 Ruby 对象的特定实例的元类:
class C
def metaclass
class << self; self; end
end
end
# This is this instance's metaclass.
C.new.metaclass => #<Class:#<C:0x01234567>>
# Successive invocations will have different metaclasses,
# since they're different instances.
C.new.metaclass => #<Class:#<C:0x01233...>>
C.new.metaclass => #<Class:#<C:0x01232...>>
C.new.metaclass => #<Class:#<C:0x01231...>>
假设我只想知道任意类的任意对象实例obj
的元类,我不想在obj
的类上定义metaclass
(或类似)方法。
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:正式名称为singleton_class
。获得它的方法(在 Ruby 1.9.2 中)很简单:
obj.singleton_class
对于较旧的 Ruby 版本,您可以使用backports
:
require 'backports/1.9.2/kernel/singleton_class'
obj.singleton_class
# or without using backports:
class << obj; self; end
【讨论】:
【参考方案2】:是的。
metaclass = class << obj; self; end
【讨论】:
小错字:我想你的意思是class << obj
,而不是@obj
。
我知道我错过了明显的语法。非常感谢!以上是关于给定一个 Ruby 对象的实例,我如何获得它的元类?的主要内容,如果未能解决你的问题,请参考以下文章