具有直接价值的对象如何成为接收者?

How can objects with immediate value be receivers?

在 Ruby 中,即使某些对象具有直接值(例如 Fixnumsymbol 对象),您仍然可以像对待任何其他对象一样对待它们。

直觉上,我很难理解这是如何完成的。不过,我确实有预感。


具有立即值的对象直接绑定到变量名,而对于其他 'normal' 对象,对所述对象的引用绑定到变量名。

因为绑定到具有立即值的对象的变量绑定到对象本身的直接编码,并且该编码必须适合 unsigned long,所以 Ruby 如何知道当我去哪里时说 8.to_s 来处理消息(寻找方法)?

通常,对象是其实例的 class 的引用(或单例 class 的引用)作为对象状态的一部分包含在内。换句话说,对象有下一步去哪里的方向。

当 Ruby 只有一个 unsigned long 可以用来封装对象时,它是如何做到这一点的?

我假设它在最初构建环境时设置了一个引用适当 class 的全局常量。 我的这个假设是否正确?

如果是这样,Ruby如何确定它正在看的东西是Fixnum物体,还是symbol物体,或者你有什么? (通常它不关心,它只是跟随链接搜索方法名称,但在这种情况下,它需要知道它正在处理的对象的类型是什么,所以它知道要跟随哪个引用。)

Ruby 中的立即数仍然是 Ruby VALUE,但它们被一个特殊标志屏蔽,该标志告诉 Ruby 给定 VALUE 包含哪种立即数。例如,Fixnums 就是 unsigned long value left-shifted and tagged with the 0x01 bit.

给定一个 VALUE,Ruby 然后可以通过将它屏蔽在 RUBY_IMMEDIATE_MASK (0x07). If it is an immediate, then it then treats it as an instance of that immediate type.

上来检查它是否是一个立即值