Scala:元组集不允许我添加 "straight" 元组

Scala: Set of tuples doesn't allow me to add a "straight" tuple

我有一个可变 Hashmap 的代码,它带有一个带有元组的可变 Set:

  val field = mutable.HashMap[String, mutable.Set[(Pos3, Pos3)]]()

在 foreach 循环中,我正在填充 field

scanner.combinations(2).foreach(comb => {
  val dist = s"${comb(0).dist(comb(1))}"
  field += (dist -> (field.getOrElse(dist, mutable.Set()) += (comb(0), comb(1))))
}

未编译消息:

 found   : aoc2021.Pos3
 required: (aoc2021.Pos3, aoc2021.Pos3)
      field += (dist -> (field.getOrElse(dist, mutable.Set()) += (comb(0), comb(1))))

然而,每当我用值引用元组更改裸 (comb(0), comb(0)) 时:

scanner.combinations(2).foreach(comb => {
  val posTuple = (comb(0),comb(1))
  val dist = s"${comb(0).dist(comb(1))}"
  field += (dist -> (field.getOrElse(dist, mutable.Set()) += posTuple))
}

它编译和执行得很好。我也玩过(不可变的)集合:同样的故事。 PS 我知道我应该使用惯用的 scala 并放弃副作用和 foreach。

请记住,当您执行 foo += x 时,这只是 foo.+=(x) 的糖语法(即省略点和括号)
但是当你做 foo += (x, y) 时,编译器认为你只是省略了点而不是传递一个元组,这会产生你所看到的错误。

解决方案是使用双括号,如:((comb(0), comb(1))) 或使用 -> 扩展方法,如:(comb(0) -> comb(1))


这就是我不喜欢该语言允许的过多糖语法的无数原因之一