在每个Ruby程序中Symbol
:x(其中x是允许用作Symbol
名称的任何字符序列)具有相同的object_id
。
同样的事情是假/真/零。
我想知道 - 为什么?这是否意味着每次Ruby在代码执行之前初始化所有这些对象(如false / true / nil)? < --- 已经在这里回答:How does object_id assignment work?
那么Symbols
呢?这些初始化也是吗?数百万种可能的组合?它们的.object_id在程序之间是如何相同的呢?
答案 0 :(得分:3)
所以我通过互联网搜索并发现了这篇文章http://threebrothers.org/brendan/blog/memory-and-ruby-symbols/。我知道ruby进程维护一个symbol table,只要进程存在,每个符号就有一个条目,所以无论何时创建一个新符号,ruby都会在该符号表中进行搜索,如果不存在则会创建一个新符号一个到最后一个条目,就像数据库表中的条目一样。
更多可以提供帮助的消息来源:
答案 1 :(得分:-1)
来自"The Book Of Ruby"
实际上,符号是指向符号表的指针。符号 table是Ruby的已知标识符的内部列表 - 例如变量 和方法名称。
符号作为键是有效的,因为它不能作为键的实例。它就像一个常数。
还值得注意的是,每个整数都将具有相同的object_id
而不是像String这样的类型。 Boolean
,FixNum
,nil
具有相同的object_id
"Iamnotefficentasakey".object_id #=> Different here
"Iamnotefficentasakey".object_id #=> Different here
:iam.object_id #=> Same here
:iam.object_id #=> Same here