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

时间:2015-04-05 16:03:37

标签: ruby-on-rails ruby irb

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

同样的事情是假/真/零。

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

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

2 个答案:

答案 0 :(得分:3)

所以我通过互联网搜索并发现了这篇文章http://threebrothers.org/brendan/blog/memory-and-ruby-symbols/。我知道ruby进程维护一个symbol table,只要进程存在,每个符号就有一个条目,所以无论何时创建一个新符号,ruby都会在该符号表中进行搜索,如果不存在则会创建一个新符号一个到最后一个条目,就像数据库表中的条目一样。

更多可以提供帮助的消息来源:

Id2sym & symbol.object_id

答案 1 :(得分:-1)

来自"The Book Of Ruby"

  

实际上,符号是指向符号表的指针。符号   table是Ruby的已知标识符的内部列表 - 例如变量   和方法名称。

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

还值得注意的是,每个整数都将具有相同的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