我正在推广BasicObject
,我想实施Object#class
方法。除了硬编码返回值之外,我不知道如何做到这一点:
class MyObject < BasicObject
def class
::Kernel::eval "::MyObject"
end
end
MyObject.new.class
#=> MyObject
使用此解决方案,任何继承自MyObject
的类都必须覆盖此方法以保持其准确性。还有更好的方法吗?
答案 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
,因此几乎缺少所有基本方法,包括class
或ancestors
。您需要对所有内容进行硬编码。除了最小的语法,一切都消失了。把它想象成tabla rasa。没有其他方法可以构建您的方法。
Ruby旨在让所有对象都继承自Object
,并且反对它不会产生有用的结果。
答案 2 :(得分:0)
我被指向这个可能的重复问题:How do I get the class of a BasicObject instance?
提供给该问题的解决方案解决了我的问题。谢谢!