![](/img/trans.png)
[英]How to use getOrElseUpdate in scala.collection.mutable.HashMap?
[英]Adding an item to scala.collection.mutable.HashMap
我試圖將元素添加到Scala HashMap
val c2 = new collection.mutable.HashMap[String,Int]()
c2 += ("hh",1)
但是上面給了我一個編譯錯誤。
[error] found : String("hh")
[error] required: (String, Int)
[error] c2 += ("hh", 1)
[error] ^
[error] /scalathing/Main.scala:5: type mismatch;
[error] found : Int(1)
[error] required: (String, Int)
[error] c2 += ("hh", 1)
[error] ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 3 s, completed Sep 1, 2016 1:22:52 AM
我要添加的對似乎是HashMap
要求的正確類型。 為什么會出現編譯錯誤?
+=
運算符被重載以使用可變參數。 因此,當編譯器看到c2 += ("hh", 1)
它將解釋為傳入了兩個參數,其中一個是“ hh”,另一個是1。您可以使用->
來解決此問題。運算符,即c2 += ("hh" -> 1)
或將元組包含在另一系列的括號中,即c2 += (("hh, 1))
。
根據評論的要求,在下面略加細節。
關於所有這些的工作原理,在可變集合(例如HashMap
的情況下, +=
只是使用運算符語法(即空格而不是.
)或Scala社區稱之為“中綴表示法”的普通方法調用, Scala中的方法即可。 它是由Growable
特性提供的,可變集合會混入其中。您可以在Growable
文檔中看到+=
方法和可變參數方法。 換句話說,以下代碼也可以工作。
c2.+=(("hh", 1))
但是,並非所有+=
都相等 。 +=
通常也顯示在var
。 盡管可以使用方法語法調用它.
,這是Scala編譯器直接實現的神奇語法糖。 特別是,任何非字母數字名稱后跟一個=
都會被刪除。 x $NAME= y
變成x = x.$NAME(y)
。 在這種情況下,當且僅當$NAME
是可變參數時, $NAME=
是可變參數。
var i = 0
i += 1
i.+=(1) // Also compiles
case class SuperInt(raw: Int) {
def &*&(x: SuperInt) = SuperInt(raw + x.raw)
}
var x = SuperInt(1)
x &*&= SuperInt(1) // This works
x.&*&=(SuperInt(1)) // As does this
x &*&= (SuperInt(1), SuperInt(1)) // Does not compile because &*& is not variadic
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.