【问题标题】:Scala: Set of tuples doesn't allow me to add a "straight" tupleScala:元组集不允许我添加“直”元组
【发布时间】: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 转换为答案,我可以正确奖励它。

标签: scala hashmap set tuples


【解决方案1】:

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2019-06-26
    • 2020-10-16
    • 1970-01-01
    • 2013-01-24
    • 2016-09-08
    • 2021-10-25
    相关资源
    最近更新 更多