gpt4 book ai didi

scala - Scala 是否具有用于制作不可变数据结构的修改克隆的记录更新语法?

转载 作者:行者123 更新时间:2023-12-03 15:12:10 26 4
gpt4 key购买 nike

在 Mercury 中,我可以使用:

A = B^some_field := SomeValue

将 A 绑定(bind)到 B 的副本,除了 some_fieldSomeValue而不是 B 中的任何内容。我相信 Haskell 等价物类似于:
a = b { some_field = some_value }

Scala 是否有类似的东西来“修改”不可变值。另一种选择似乎是有一个构造函数直接设置实例中的每个字段,这并不总是理想的(如果构造函数应该维护不变量)。另外,如果我必须在我想要修改副本的实例中显式传递所有其他值,那将非常笨拙且更加脆弱。

我通过谷歌搜索或在语言引用手册或“Scala By Example”的简要调查中找不到任何相关信息(我已经从头到尾阅读了,但还没有完全吸收,所以它可能好在那里)。

我可以看到这个特性可能与 Java 风格的访问保护和子类有一些奇怪的交互......

最佳答案

如果您将您的类(class)定义为 case class ,方便的copy方法是生成的,调用它可以使用命名参数为某些字段指定新值。

scala> case class Sample(str: String, int: Int)
defined class Sample

scala> val s = Sample("text", 42)
s: Sample = Sample(text,42)

scala> val s2 = s.copy(str = "newText")
s2: Sample = Sample(newText,42)

它甚至适用于多态案例类:
scala> case class Sample[T](t: T, int: Int)
defined class Sample

scala> val s = Sample("text", 42)
s: Sample[java.lang.String] = Sample(text,42)

scala> val s2 = s.copy(t = List(1,2,3), 42)
s2: Sample[List[Int]] = Sample(List(1, 2, 3),42)

请注意 s2具有与 s 不同的类型.

关于scala - Scala 是否具有用于制作不可变数据结构的修改克隆的记录更新语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6662092/

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