Floats 和 Symbols 如何具有即时价值?

How can Floats and Symbols have immediate value?

一位 Whosebug 用户告诉我,Floats 现在在 Ruby 中具有直接价值。但是,我对这是如何实现的感到困惑。

我也很困惑 Symbols 如何具有即时价值。

我理解具有立即值的对象是可以将整个状态信息封装到名为 VALUE.

unsigned long C 变量中的对象

我可以直观地理解在考虑小整数(Fixnums)和诸如 true false nil 等微不足道的事情时这是如何可能的

但是,FloatSymbol 没有长度限制,如果没有自己的结构,这些对象如何表示?

首先,Float 有长度限制 - Float 基本上是本机双精度浮点值,即 64 位。但这仍然太多了,所以只有当尾数不太大时 Float 才是立即值(您可以看到确切的条件 here)。

至于符号,有一个数据结构枚举了所有创建的符号,所以它们可以被称为 table 的偏移量(在 ruby 2.2 上只有一些符号是这样的 - 那些不是 "normal",可收集的垃圾对象)。