【问题标题】:Given an instance of a Ruby object, how do I get its metaclass?给定一个 Ruby 对象的实例,我如何获得它的元类?
【发布时间】: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(或类似)方法。

有没有办法做到这一点?

【问题讨论】:

    标签: ruby metaprogramming metaclass singleton


    【解决方案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 &lt;&lt; obj; self; end

      【讨论】:

      • 小错字:我想你的意思是class &lt;&lt; obj,而不是@obj
      • 我知道我错过了明显的语法。非常感谢!
      猜你喜欢
      • 2011-10-26
      • 2021-11-12
      • 1970-01-01
      • 2010-11-25
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2012-11-26
      相关资源
      最近更新 更多