5

通常,我可能会通过以下方式获取 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类,并且不想metaclassobj.

有没有办法做到这一点?

4

2 回答 2

12

正式名称是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
于 2010-05-31T21:30:38.993 回答
7

是的。

metaclass = class << obj; self; end

于 2010-05-31T20:31:24.927 回答