【问题标题】:Why does :+ appending to a Seq have no effect?为什么 :+ 附加到 Seq 没有​​效果?
【发布时间】:2013-05-31 00:04:37
【问题描述】:

我想要一个带有 (String, Int, Int) 的三元组的结果序列,如下所示:

var all_info: Seq[(String, Int, Int)] = null

现在我尝试向我的 Seq 添加元素,如下所示:

  if (all_info == null) {
    all_info = Seq((name, id, count))
  } else {
    all_info :+ (name, id, count)
  }

并打印出来

    Console.println(all_info.mkString)

不幸的是,打印的结果只是 if 子句添加的第一个三元组,基本上初始化了一个新的 Seq,因为它之前只是“null”。 以下所有应该在 else 子句中添加到 Seq 的三元组都不是。 我还尝试了不同的方法,例如“++”,但也不起作用(“参数太多”)

无法真正弄清楚我在这里做错了什么。

提前感谢您的帮助! 问候。

【问题讨论】:

    标签: scala sequence seq


    【解决方案1】:

    首先,最好不要使用nulls,而是使用空集合。下次使用 :+= 所以 :+ 不会被丢弃 - :+ 会生成一个新的集合作为结果,而不是修改现有的集合。最终代码如下所示

    var all_info: Seq[(String, Int, Int)] = Seq.empty
    all_info :+= (name, id, count)
    

    如您所见,现在您不需要 ifs 并且代码应该可以正常工作。

    【讨论】:

    • 很奇怪,在库中它是: :+ = 此序列的副本,附加了一个元素。所以我认为它只会将新的三元组附加到现有结果中,甚至没有“:+=”。无论如何,代码工作正常,我了解了一个新的操作员,感谢您的帮助! :)
    【解决方案2】:

    方法 :+ 创建新集合,并且保持原始集合不变。

    你应该使用方法+=。如果all_info 中没有方法+=,编译器会将all_info += (name, id, count) 视为all_info = all_info + (name, id, count)

    相反,如果您将all_info 的类型更改为某个可变集合,您将在其中获得方法+=,因此您的代码将按预期工作:方法+= 可变集合更改目标集合。

    请注意,mutable collections 中没有方法 :+=,因此即使对于可变集合,您也会得到 all_info = all_info :+ (name, id, count)

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2021-04-17
      • 2018-02-24
      相关资源
      最近更新 更多