7

私はこのような機能を持っています:

private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t }

コンパイラは、val への再割り当てがあると不平を言うので、これを変更可能なマップに変更するまでもなく、ケース クラスのように「var k: Map...」のようなことを言う方法はありますか?

ありがとう!

4

1 に答える 1

9

あなたが求めているのは、参照引数による受け渡しです。JVM にはそれらがなく、Scala にもありません。*

更新されたマップを返す必要があります。

private def add[T](n: String, t: T, k: Map[String,T]): Map[String,T] = k + (n -> t)

または両方を返すか、返す必要がある場合はT、ラッパー クラスを記述します。

case class Vary[A](var value: A) { def apply() = value }
private def add[T](n: String, t: T, k: Vary[Map[String,T]]) = { k.value += (n -> t); t }

val map = Vary( Map.empty[String,Int] )
add("fish", 5, map)
map()  //Map[String,Int] = Map(fish -> 5)

*まあ、直接ではありません。もちろん、何らかの方法でクロージャを使用して外部コンテキストで var を変更する必要があります。実際、Scala が行うことは、上で示したものとよく似たラッパー クラスを使用することです。

于 2012-06-30T19:26:21.623 に答える