gpt4 book ai didi

scala - 如何 "update"Scala 中不可变集合中的不可变元素?

转载 作者:行者123 更新时间:2023-12-01 11:46:41 26 4
gpt4 key购买 nike

我有一组 Set 元素,它们围绕一个键定义了它们的相等性,但其他字段可能不同......所以当我需要“更新”时,这就是我尝试过的:

object sandbox {

case class K(val id: Int, val message: String) {
override def equals(that: Any) = that match {
case K(this.id, _) => true
case _ => false
}
override def hashCode = this.id
override def toString = "(" + id + "," + message + ")"
}

val s = Set(K(1, "a"), K(2, "b")) //> s : scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))
val updatedElem = K(1, "c") //> updatedElem : test.sandbox.K = (1,c)

s + updatedElem //> res0: scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))

Set(updatedElem) | s //> res1: scala.collection.immutable.Set[test.sandbox.K] = Set((1,c), (2,b))
}

添加一个已经存在的元素不会改变集合,先删除它然后再添加更新的元素似乎有点次优。

union 方法保留集合左侧的元素,但该行为未记录;所以我不应该依赖它。

那么现在,是否有更明显的我遗漏的东西?我应该依赖实际行为(并编写测试以防它发生变化)吗?还是应该分两步进行更新?

最佳答案

在我看来,其实是建模的概念问题。关键是相等的对象应该真的是等价的……否则你可能要考虑一些其他的结构。例如,为什么不尝试将 id 映射到 message(或将 id 映射到 K(id ,消息))?这在概念上似乎更清晰,然后您可以使用 .updated(1,"c") 来更新它。

关于scala - 如何 "update"Scala 中不可变集合中的不可变元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com