【问题标题】:Unique id for Scala objectScala 对象的唯一 ID
【发布时间】:2014-06-05 12:22:16
【问题描述】:

在 Python 中,id(x) 给出了对象 x 的唯一 id。 Scala 中的等价物是什么?

>>> id(True)
1166096
>>> id(False)
1166108
>>> x = id([1,2,3])
>>> id(x)
2058589988
>>> y = id([1,2,3])
>>> id(y)
2058589976

我可以使用 x.hashCode 作为 id,但是当内容相同时它会返回相同的值。我想知道以下代码中的a eq b == false 是什么。 a eq b 中比较了哪些值?

scala> val a = ArrayBuffer(1,2,3)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> val b = ArrayBuffer(1,2,3)
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> a.hashCode
res44: Int = 387518613

scala> b.hashCode
res45: Int = 387518613

scala> a eq b
res39: Boolean = false

【问题讨论】:

  • 除了isweakref 为您提供的功能之外,您是否还需要id 的某些特定功能?

标签: scala object


【解决方案1】:

这是不可能的。您需要自己生成并跟踪 ID。

eq比较引用,类似于Java中的==

System.identityHashCode(这是Any.hashCode的默认实现)但不保证是唯一的。

您也许可以使用 JNI 实现id,尽管由于可能存在压缩 GC,这可能并非易事。不过,我对 JNI 了解不多。

即便如此,我也不认为id 是一个有用的功能,也没有看到 任何 用于它。如果您需要对对象的引用,请存储引用。如果您需要弱引用,请使用java.lang.ref.WeakReference[T]

【讨论】:

  • 哇,使用 JNI 生成唯一的 id ......这有点像用作悍马的显微镜
  • (那不是我,顺便说一句)
  • 关于看不到可能的用途:人们可能想要检查给定对象是否已经存在于一组对象“O”中。使用eq,您所能做的就是始终与“O”中的所有对象进行比较,线性。如果一个人有一个 id,它可以把它放在一个集合中,使这个检查线性
【解决方案2】:

我可以使用 x.hashCode 作为 id,但它会返回相同的值 当内容相同时。

首先:不。根据文档:“默认散列算法取决于平台。”所以不要对 hashCode 做任何假设。

第二:eq 比较引用。根据文档:“测试参数 (arg0) 是否是对接收器对象 (this) 的引用。”

第三:你无法在scala中得到对应的python id。

【讨论】:

  • 如果对象相等,hashCode必须返回相同的值。当然,这不一定与“内容相同”匹配,但任何不保留此属性的实现都是不正确的。
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多