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))
这就是我不喜欢该语言允许的过多糖语法的无数原因之一。
我有一个可变 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))
这就是我不喜欢该语言允许的过多糖语法的无数原因之一。