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 に答える