Ruby 这两个红宝石符号有什么区别?
我在使用对象ID后发现了这一点Ruby 这两个红宝石符号有什么区别?,ruby,symbols,objectid,splat,Ruby,Symbols,Objectid,Splat,我在使用对象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)
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
但第二个却不是?我想它们在被传给印刷品后看起来是一样的。但是有什么区别呢?其中有一个是unicode符号吗
更新:第二个可能是用于关键字参数的新的双splat,但我似乎无法验证这一点。这些命令可能很有启发性:
ObjectSpace._id2ref(2648).class.ancestors
ObjectSpace._id2ref(6688).class.ancestors
您使用的是哪个Ruby版本?我发现了射程误差。2.0.0-p-353。从
pry-v
我得到了Ruby 2.0.0上的pry版本0.9.12.6。对象ID在Ruby调用中不一定是相同的,所以除非您能够提供重现所看到的内容的显式步骤,否则任何人都不能说太多。OTOH,id=':**'。对象id;放置对象空间。_id2ref(id)
是建议性的,那么为什么不检查_id2ref
返回值的类呢?正如Arup所说,它确实会引起范围错误,但它进一步说范围错误:0x00000000001a20不是符号id值
,因此,这个数字似乎符合符号对象的可能范围。我怀疑这可能与关键字参数有关,它使用**
指示参数列表中的选项哈希。我无法复制1.9.3中的问题。看起来有一个额外的“隐藏”符号,***
符号没有出现在符号表中,但可以通过查看ObjectSpace找到。唉,因为它们都是符号,这只能告诉我们所有符号的情况。