簡體   English   中英

向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM