How to get Ponter/Reference semantics in Scala

自闭症网瘾萝莉.ら 提交于 2019-12-12 12:08:27

问题


In C++ I would just take a pointer (or reference) to arr[idx].
In Scala I find myself creating this class to emulate a pointer semantic.

class SetTo (val arr : Array[Double], val idx : Int) {
  def apply (d : Double) { arr(idx) = d }
}

Isn't there a simpler way?
Doesn't Array class have a method to return some kind of reference to a particular field?


回答1:


Arrays used in Scala are JVM arrays (in 2.8) and JVM arrays have no concept of a slot reference.

The best you can do is what you illustrate. But SetTo does not strike me as a good name. ArraySlot, ArrayElement or ArrayRef seem better.

Furthermore, you might want to implement apply() to read the slot and update(newValue) to replace the slot. That way instances of that class can be used on the left-hand-side of an assignment. However, both retrieving the value via apply and replacing it via update method will require the empty argument lists, ().

class ASlot[T](a: Array[T], slot: Int) {
  def apply(): T = a(slot);
  def update(newValue: T): Unit = a(slot) = newValue
}

scala> val a1 = Array(1, 2, 3)
a1: Array[Int] = Array(1, 2, 3)

scala> val as1 = new ASlot(a1, 1)
as1: ASlot[Int] = ASlot@e6c6d7

scala> as1()
res0: Int = 2

scala> as1() = 100

scala> as1()
res1: Int = 100

scala> a1
res2: Array[Int] = Array(1, 100, 3)


来源:https://stackoverflow.com/questions/2799128/how-to-get-ponter-reference-semantics-in-scala

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!