实现Ruby的Object#类方法

时间:2013-07-20 03:26:21

标签: ruby

我正在推广BasicObject,我想实施Object#class方法。除了硬编码返回值之外,我不知道如何做到这一点:

class MyObject < BasicObject
  def class
    ::Kernel::eval "::MyObject"
  end
end

MyObject.new.class
#=> MyObject

使用此解决方案,任何继承自MyObject的类都必须覆盖此方法以保持其准确性。还有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

在Ruby中实现此方法是不可能的。您需要访问Ruby无法访问的三件事:

  • 类指针
  • 超类指针
  • 虚拟类标志(包括类和单例类是虚拟类)

Object#class的工作原理如下:

class Object
  def class
    c = self.__class__
    c = c.__superclass__ while c.__virtual__?
    c
  end
end

还有Class#superclass

class Class
  def superclass
    c = self.__superclass__
    c = c.__superclass__ while c.__virtual__?
    c
  end
end

由于无法获取类指针(请记住:class方法返回它)并且无法获取超类指针(请记住: superclass方法也没有返回它)并且你无法检查一个类是否是虚拟的,不可能在Ruby中编写这个方法。

您需要某种对运行时内部的特权访问才能执行此操作。

答案 1 :(得分:0)

由于您拒绝继承Object,因此几乎缺少所有基本方法,包括classancestors。您需要对所有内容进行硬编码。除了最小的语法,一切都消失了。把它想象成tabla rasa。没有其他方法可以构建您的方法。

Ruby旨在让所有对象都继承自Object,并且反对它不会产生有用的结果。

答案 2 :(得分:0)

我被指向这个可能的重复问题:How do I get the class of a BasicObject instance?

提供给该问题的解决方案解决了我的问题。谢谢!