【问题标题】:What is the difference between these two Ruby symbols?这两个 Ruby 符号有什么区别?
【发布时间】: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


【解决方案1】:

这些命令可能很有启发性:

ObjectSpace._id2ref(2648).class.ancestors
ObjectSpace._id2ref(6688).class.ancestors

【讨论】:

  • 唉,因为它们都是符号,这只能告诉我们有关所有符号的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2016-07-01
  • 2012-06-12
  • 2016-10-06
相关资源
最近更新 更多