在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
答案 0 :(得分:6)
不可能这样做。您需要自己生成并跟踪ID。
eq
比较引用,类似于Java中的==
。
有System.identityHashCode
(这是Any.hashCode
的默认实现)但不保证是唯一的。
您可以使用JNI实现id
,但由于可能需要压缩GC,因此可能并不简单。但是,我对JNI了解不多。
即便如此,我也没有看到id
是一项有用的功能,我也没有看到任何使用它。如果需要对对象的引用,请存储引用。如果您需要弱引用,请使用java.lang.ref.WeakReference[T]
。
答案 1 :(得分:2)
我可以使用x.hashCode作为id,但它将返回相同的值 当内容相同时。
首先:不。根据文档:"默认的散列算法取决于平台。"所以不要对hashCode做任何假设。
第二:eq
比较参考。根据文档:"测试参数(arg0)是否是对接收者对象(this)的引用。"
第三:你不能在scala中获得等效的python id。