2015-04-05 72 views
1

在每个Ruby程序Symbol中:x(其中x是允许用作Symbol的名称的任何字符序列)具有相同的object_id键(和一些其他对象)的object_id总是相同的。这是为什么?

同样的事情与假/真/无。

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

什么?这些初始化吗?数百万种可能的组合?它们的.object_id在程序之间怎么可能是相同的。

+0

我想一个更好的问题是。 “Ruby用来计算对象的'object_id'的方法是什么?”不用说,如果每次运行Ruby时,特定对象的'object_id'都会发生变化,这是因为某些事情正在发生变化。由于没有任何更改,您可以在同一个平台上为特定对象指定相同的object_id。 – yeyo 2015-04-05 16:13:10

+0

从这个角度来看,我没有接近问题!不错的提示:) – 2015-04-05 16:17:02

+2

http://stackoverflow.com/questions/3430280/how-does-object-id-assignment-work – 2015-04-05 17:33:03

回答

3

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

更多的来源,可以帮助:

Id2sym & symbol.object_id

+1

想要注意的是,在Ruby中垃圾收集器有点过时了。其实符号的GC存在(后告诉它没有):http://www.sitepoint.com/symbol-gc-ruby-2-2/ – 2015-04-05 19:39:44

+0

添加了一个新的来源,可以帮助 – 2015-04-05 19:48:55

-1

"The Book Of Ruby"

符号是,事实上,一个指针到符号表中。符号 表是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 
+0

'还值得注意的是,每个整数都将具有与其他数据类型相同的object_id。“ - 这是错误的。 False/True/Nil总是有相同的ID – 2015-04-05 16:18:42

+0

@FilipBartuzi是的。编辑谢谢。 – 2015-04-05 16:24:18

相关问题