Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这两个红宝石符号有什么区别?_Ruby_Symbols_Objectid_Splat - Fatal编程技术网

Ruby 这两个红宝石符号有什么区别?

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)

我在使用对象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
但第二个却不是?我想它们在被传给印刷品后看起来是一样的。但是有什么区别呢?其中有一个是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找到。唉,因为它们都是符号,这只能告诉我们所有符号的情况。