【发布时间】:2014-04-02 23:00:06
【问题描述】:
我在玩弄对象 ID 后发现了这一点。
ObjectSpace._id2ref(2648)
=> :**
ObjectSpace._id2ref(6688)
=> :**
ObjectSpace._id2ref(2648) == ObjectSpace._id2ref(6688)
=> false
第一个是取幂运算符的符号;
2.send(ObjectSpace._id2ref(2648), 3)
=> 8
2.send(ObjectSpace._id2ref(6688), 3)
NoMethodError: undefined method `**' for 2:Fixnum
但是第二个不是吗?我假设它们在传递给#print 后看起来是一样的。但是是的区别是什么?其中之一是某种 unicode 符号吗?
更新:第二个可能是关键字参数的新双 splat,但我似乎无法验证这一点。
【问题讨论】:
-
你是哪个 Ruby 版本的?我得到范围错误。 2.0.0-p-353
-
很奇怪。从
pry -v我得到Pry version 0.9.12.6 on Ruby 2.0.0。 -
对象 id 在 Ruby 调用中不一定相同,因此除非您可以提供重现您所看到内容的明确步骤,否则没有人可以说太多。 OTOH,
id = ':**'.object_id; puts ObjectSpace._id2ref(id)是暗示性的,那么为什么不检查_id2ref返回值的类呢? -
它确实引发了 Arup 所说的范围错误,但它进一步表示
RangeError: 0x00000000001a20 is not symbol id value,因此该数字似乎适合符号对象的可能范围。 -
我怀疑这可能与关键字参数有关,关键字参数使用
**表示参数列表中的选项哈希。我无法在 1.9.3 上重现该问题。看起来有一个额外的“隐藏”**符号没有出现在符号表中,但可以通过查看 ObjectSpace 找到。
标签: ruby symbols objectid splat