Scala原语作为引用类型?

时间:2015-12-22 20:36:33

标签: scala

Scala是否提供了一种通过引用(例如,在堆上)开箱即用来访问基元的方法?例如,是否有一种惯用的方法使下面的代码返回1?:

import scala.collection.mutable

val m = new mutable.HashMap[String, Int]
var x = m.getOrElseUpdate("foo", 0)
x += 1
m.get("foo")  // The map value should be 1 after the preceding update.

我希望我能够使用类似下面的包装类作为地图的值类型(从而存储指向WrappedInts的指针):

class WrappedInt(var theInt:Int)

...但我想知道我是否缺少语言或标准库功能。

2 个答案:

答案 0 :(得分:1)

你不能用基元或它们的非基元来对付Java和Scala中的部分。看不到任何其他方式,只能使用WrappedInt

答案 1 :(得分:0)

如果您的目标是按键增加地图值,那么您可以使用一些更好的解决方案而不是包装器。

val key = "foo"
val v = m.put(key, m.getOrElse(key, 0) + 1)

或其他方法是为地图设置默认值0

val m2 = m.withDefault(_ => 0)
val v = m2.put(key, m2(key) + 1)

或添加扩展方法updatedWith

implicit class MapExtensions[K, V](val map: Map[K, V]) extends AnyVal {
  def updatedWith(key: K, default: V)(f: V => V) = {
    map.put(key, f(map.getOrElse(key, default)))
  }
}

val m3 = m.updatedWith("foo", 0) { _ + 1 }