gpt4 book ai didi

scala - 如何在 Scala 中初始化和 "modify"循环持久数据结构?

转载 作者:行者123 更新时间:2023-12-04 00:20:09 24 4
gpt4 key购买 nike

我已经搜索并找到了有关此主题的一些信息,但答案要么令人困惑,要么不适用。

我有这样的事情:

class Thing (val name:String, val refs:IndexedSeq[Ref])
class Ref (val name:String, val thing:Thing)

现在,我想说,加载一个文件,解析它并从中填充这个数据结构。它是不可变的和循环的,怎么可能呢?

另外,假设我确实填充了这个数据结构,现在我想修改它,比如更改 rootThing.refs(3).name,怎么做呢?

感谢您在这里发布的想法。在这一点上,我在想,如果一个人真的想要这样的持久数据结构,跳出框框思考并考虑客户端代码需要提出什么问题。因此,与其考虑对象和字段,不如考虑查询、索引等。首先,我从以下方面考虑:
Is there a bidirectional multimap persistent data structure?

最佳答案

对于单个循环引用,您可以使用惰性:

lazy val t: Thing = new Thing("thing", Vector(new Ref("ref", t)))

然而,显然这会因多对多连接而变得复杂。

我不知道是否存在通用的纯函数循环图数据结构。对于非循环图,这很容易,因为您可以对其进行拓扑排序,然后逐步对其进行初始化。

也许使用间接寻址对您来说是一种选择,比如说通过标识符而不是实际的 scala 对象引用来引用对象?
case class ThingByID(id: Int, name: String, refs: IndexedSeq[RefByID])
case class RefByID(name: String, thingID: Int)

然后你可以在加载你的文件后通过它们的 ID 将事物收集到一个不可变的映射中(例如 collection.immutable.IntMap )并在来自引用时查找它们。

编辑

Miles 关于 lazy val t 的第一个案例是正确的.确实,您需要按名称参数,如他的回答。
class Thing(val name: String, val refs: IndexedSeq[Ref])
class Ref(val name: String, _thing: => Thing) { def thing = _thing }

val t: Thing = new Thing("thing", Vector(new Ref("ref", t)))

关于scala - 如何在 Scala 中初始化和 "modify"循环持久数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682277/

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