【发布时间】:2022-01-20 20:29:30
【问题描述】:
我有一个可变 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。
【问题讨论】:
-
@LuisMiguelMejíaSuárez 谢谢!留下了为什么引用值 postTuple 不需要参数括号的问题?
-
@drjerry context - 一个在赋值前使用
(x, y),所以它只能是一个元组,另一个在函数调用的上下文中使用(x, y),其中假设最外层的括号包含函数的参数/method(操作符+=仍然是一个方法)。 -
@LuisMiguelMejíaSuárez 说得通!谢谢!如果您将您的 cmets 转换为答案,我可以正确奖励它。