ruby - 给定一个 Ruby 对象的实例,我如何获得它的元类?

标签 ruby metaprogramming metaclass singleton

通常情况下,我可能会通过如下方式获取 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 类的方法。

有办法吗?

最佳答案

正式名称是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

关于ruby - 给定一个 Ruby 对象的实例,我如何获得它的元类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945830/

相关文章:

ruby-on-rails - 未定义方法 `count' 为 nil :NilClass rails

ruby - Lookahead 包含与左/右 anchor 相同的标记

python - 子类的元类是如何确定的?

ruby - 如何知道正在使用 rake 执行哪个任务

ruby - 在 Ruby 中定义 2 个常量

c++ - 检测 basic_string 实例化

ruby - 在 Ruby 的 class_eval 中将 block 传递到嵌套方法中?

macros - 在 __using__ 宏中添加默认 handle_info

python - 如何在保留顺序的同时收集类变量

python - 如何在初始化时动态继承?