gpt4 book ai didi

c - Id2sym & symbol.object_id

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:06 25 4
gpt4 key购买 nike

使用 ruby-hacking-guide site ,我发现 fixnum << 8 | 1是任何 fixnum 的 object_id。
我试过对符号使用类似的方法。

#define ID2SYM(x) ((VALUE)(((long)(x))<<8|SYMBOL_FLAG))

When shifting 8 bits left, x becomes a multiple of 256, that means a multiple of 4. Then after with a bitwise or (in this case it’s the same as adding) with 0×0e (14 in decimal)

我已经用 :a 试过了(:a.object_id = 175_976,在我的 32 位系统上):

  1. a的ASCII码是97。
  2. 97 << 8 = 24832
  3. 24832 | 14 = 24_846

所以它甚至不接近 :a的对象 ID。

我检查了 object_id 的来源并发现了这个:

  *  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;

我得到了 ~ 500 000,这是很糟糕的值(value)。

那我错过了什么?如何计算交易品种的object_id?

最佳答案

您从符号 object_id 计算出的 ID 值并不直接代表该符号的字符串内容。它是 Ruby 维护的包含字符串的表的索引。当您在 Ruby 中使用一个符号时,如果该符号之前未在当前进程中使用过,它将被赋予符号表中下一个空闲槽的 ID 值。

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

您可以通过启动一个新的 Ruby 进程、创建一个新的符号并查看它的 object_id,然后用不同的符号名称重复来看到这一点。 object_id 在这两种情况下应该相同,因为它将引用符号表中的下一个空闲点。执行此操作时需要小心,因为 Ruby 本身定义了很多符号,因此如果您使用其中之一,您会得到不同的结果。

例如,irb session :

2.1.0 :001 > Symbol.all_symbols.find {|sym| sym.to_s == 'matt' }
=> nil
2.1.0 :002 > :matt.object_id
=> 542248

还有一个:

2.1.0 :001 > Symbol.all_symbols.find {|sym| sym.to_s == 'banana' }
=> nil
2.1.0 :002 > :banana.object_id
=> 542248

在这里,我们首先检查我们要使用的名称是否作为符号不存在,然后我们创建符号并查看其 object_id。在这两种情况下,它都是相同的 542248,对应于 2118 的 ID,尽管它们具有不同的名称(这些值在不同的系统或 Ruby 版本上可能不同)。

关于c - Id2sym & symbol.object_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21073919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com