Учитывая экземпляр объекта Ruby, как мне получить его метакласс? - PullRequest
4 голосов
/ 01 июня 2010

Обычно я могу получить метакласс для конкретного экземпляра объекта 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 произвольного класса, и я не хочу определять metaclass (или аналогичный) метод для класса obj.

Есть ли способ сделать это?

Ответы [ 2 ]

11 голосов
/ 01 июня 2010

Официальное название 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
7 голосов
/ 01 июня 2010

Да.

metaclass = class << obj; self; end

...