Rust中多个交叉引用的最佳方法是什么?

时间:2017-08-01 12:31:53

标签: rust ownership borrowing

我将某些随机几何的蒙特卡罗模拟从Python转换为Rust。我在Python中拥有的自由让我在整个代码中都存储了对其他对象的引用,但在Rust中实现这一点似乎更为棘手。

在我目前的Python实现中,主要对象是Geometry。它包含Vertex es的字典,其中包含唯一ID(ID也是字典中的查找键)和Triangle s字典(与Vertex相同的字典)。每个Triangle都包含三个Vertex es的列表(这次没有字典,这里是一个有序列表),每个Vertex都包含所有{{1}的字典它出现在(再次由Triangle的唯一ID索引)。

这导致了大量的交叉引用,但它确实使得查找事物变得非常容易。例如,通过简单地遍历它出现的所有Triangle并收集所有Vertex es,可以直接找到特定Vertex的所有相邻Triangle es。这些Vertex中包含的内容。

为方便起见,以下是数据结构的摘要:

Triangle

在Rust中,由于所有权模型,这不起作用。我能想出的最简单的替代方法是给class Geometry(object): def __init__(self): self.vertices = {} self.triangles = {} class Vertex(object): counter = 0 def __init__(self): self.index = Vertex.counter Vertex.counter += 1 self.triangles = {} class Triangle(object): counter = 0 def __init__(self, vertices): self.index = Triangle.counter Triangle.counter += 1 self.vertices = vertices # list of length 3 个对象Geometry es和HashMap成员Vertex,就像我的Python代码一样由ID索引)。然后,TriangleVertex对象将包含其“'成员”ID的向量/数组。然后,可以使用此ID在Triangle中找到适当的对象。

例如,如果某个HashMap包含ID为1,2和3的Triangle,我可以设置变量' vertices'在数组Vertex的{​​{1}}对象中。但是,为了以后实际使用Triangle个对象,我必须随后在[1,2,3]中查找对象。这将导致整个代码中的大量重复。此外,由于VertexHashMap结构不了解结构Triangle,因此无法向VertexGeometry添加方法将封装此过程 - 毕竟,他们无法访问相应的Triangle

我一直在考虑一种借用这种方法来实现这项工作的方法,以便VertexHashMap对象实际上可以存储彼此的引用。但是,我对Rust的经验非常缺乏,所以我没有走得太远。一些最初的天真方法总是遇到生命周期的问题,我甚至开始怀疑我目前的设置在Rust范例中是否可行。

对我问题的任何部分的所有反馈都非常欢迎。理想情况下,我正在寻找关于如何在我的思路中实施某些事情的具体建议,但如果你认为我应该重新考虑我的整个方法,那么我也很高兴听到这个。

0 个答案:

没有答案