在Ruby中,即使某些对象具有直接价值(例如Fixnum
和symbol
个对象),您仍然可以像对待任何其他对象一样对待它们。
直观地说,我无法理解这是如何完成的。但是,我确实有预感。
具有直接价值的对象直接绑定到变量名称,而对于其他正常的'对象,对所述对象的引用改为绑定到变量名。
因为绑定到具有立即值的对象的变量绑定到对象本身的直接编码,并且此编码必须适合unsigned long
,所以当我说8.to_s
时,Ruby如何知道要去哪里处理消息(寻找方法)?
通常,对象是对象的实例(或对单例类的引用)的类的引用包含在对象状态的一部分中。换句话说,该对象具有下一步的指示。
如果Ruby拥有unsigned long
来封装对象,那么Ruby如何做到这一点?
我认为它设置了一个全局常量,它在最初构建环境时引用了相应的类。我在这个假设中是否正确?
如果是这种情况,Ruby如何确定它所看到的东西是Fixnum
对象,还是symbol
对象或者你有什么? (通常它并不关心,它只是跟随链接搜索方法名称,但在这种情况下,它需要知道它正在处理的对象类型是什么,因此它知道要遵循哪个引用。 )
答案 0 :(得分:1)
Ruby中的直接值仍然是Ruby VALUE,但是它们被一个特殊的标志所掩盖,该标志告诉Ruby给定的VALUE包含什么样的直接值。例如,Fixnums只是unsigned long value left-shifted and tagged with the 0x01 bit。
鉴于VALUE,Ruby可以通过屏蔽RUBY_IMMEDIATE_MASK (0x07)来检查它是否是立即值。如果是立即数,那么它就是treats it as an instance of that immediate type。