object_id 个键(和其他一些对象)始终相同。这是为什么?

object_id of keys (and some other objects) are always the same. Why is that?

在每个 Ruby 程序中 Symbol :x(其中 x 是允许用作 Symbol 名称的任何字符序列)具有相同的 object_id .

false/true/nil也是一样。

我想知道 - 为什么会这样?这是否意味着每次 Ruby 在执行代码之前初始化所有这些对象(如 false/true/nil)? <--- 已在此处回答:How does object_id assignment work?

那么 Symbols 呢?这些也初始化了吗?数百万种可能的组合?他们的 .object_id 怎么可能在程序之间是相同的。

来自"The Book Of Ruby"

A symbol is, in fact, a pointer into the symbol table. The symbol table is Ruby’s internal list of known identifiers – such as variable and method names.

Symbol 作为键是有效的,因为不能有它的实例。这就像一个常数。

还值得注意的是,每个整数都将具有相同的 object_id,而不是像 String 这样的类型。 BooleanFixNumnil有相同的object_id

"Iamnotefficentasakey".object_id #=> Different here 
"Iamnotefficentasakey".object_id #=> Different here
:iam.object_id #=> Same here
:iam.object_id #=> Same here

所以我在互联网上搜索并找到了这篇文章 http://threebrothers.org/brendan/blog/memory-and-ruby-symbols/ . I come to know that ruby process maintains a symbol table 只要进程存在,每个符号都有一个条目,所以每当创建一个新符号时 ruby 在该符号 table 如果不存在,它会为最后一个条目创建一个新符号,就像数据库 tables.

中的条目一样

更多可以提供帮助的资源:

Id2sym & symbol.object_id