Id2sym&;symbol.object\u id

Id2sym&;symbol.object\u id,c,ruby,C,Ruby,使用,我发现从符号object\u ID计算的fixnum值不能直接表示该符号的字符串内容。它是Ruby维护的包含字符串的表的索引。当您在Ruby中使用一个符号时,如果该符号以前在当前进程中没有使用过,那么它将被赋予符号表中下一个空闲槽的ID值 这意味着给定的符号并不总是具有相同的ID值。Ruby进程符号关联的ID值将取决于它们的创建顺序 您可以通过启动一个新的Ruby进程、创建一个新符号并查看其对象\u id,然后使用不同的符号名称重复来看到这一点。在这两种情况下,object\u id应该是

使用,我发现从符号
object\u ID
计算的
fixnum值不能直接表示该符号的字符串内容。它是Ruby维护的包含字符串的表的索引。当您在Ruby中使用一个符号时,如果该符号以前在当前进程中没有使用过,那么它将被赋予符号表中下一个空闲槽的
ID

这意味着给定的符号并不总是具有相同的
ID
值。Ruby进程符号关联的
ID
值将取决于它们的创建顺序

您可以通过启动一个新的Ruby进程、创建一个新符号并查看其
对象\u id
,然后使用不同的符号名称重复来看到这一点。在这两种情况下,
object\u id
应该是相同的,因为它将引用符号表中的下一个空闲点。这样做需要小心,因为Ruby本身定义了很多符号,所以如果使用其中一个符号,将得到不同的结果

例如,一个
irb
会话:

2.1.0:001>Symbol.all_symbols.find{sym | sym.to_s=='matt'}
=>零
2.1.0:002>:matt.object\u id
=> 542248
还有一个:

2.1.0:001>Symbol.all_symbols.find{sym | sym.to_s=='banana'}
=>零
2.1.0:002>:banana.object\u id
=> 542248 
在这里,我们首先检查要使用的名称是否作为符号存在,然后创建符号并查看其
对象id
。在这两种情况下,它都是相同的
542248
,对应于2118的
ID
,即使它们有不同的名称(这些值在不同的系统或Ruby版本上可能不同)

  *  sizeof(RVALUE) is
  *  20 if 32-bit, double is 4-byte aligned
  *  24 if 32-bit, double is 8-byte aligned
  *  40 if 64-bit
  */
 if (SYMBOL_P(obj)) {
     return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;