2

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

在我当前的 Python 实现中,主要对象是Geometry. 它包含一个Vertex带有唯一 ID 的 es 字典(ID 也是它在字典中的查找键)和一个Triangles 字典(与 for 相同的场景Vertex)。EveryTriangle包含三个Vertexes 的列表(这次没有字典,这里是有序列表),并且 everyVertex包含它出现的所有 s 的字典(再次由的唯一 IDTriangle索引)。Triangle

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

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

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

在 Rust 中,由于所有权模型,这将不起作用。我能想到的最直接的替代方法是给Geometry对象一个es 和s 的成员HashMap,就像在我的 Python 代码中一样(再次按 ID 索引)。然后,and对象将包含其“成员”的 ID 的向量/数组。然后可以使用此 ID 在.VertexTriangleVertexTriangleHashMap

例如,如果某个Triangle包含VertexID 为 1、2 和 3 的 es,我可以将Triangle对象中的变量 'vertices' 设置为数组[1,2,3]。但是,为了之后实际使用这些Vertex对象,我必须随后在HashMap. 这将导致整个代码中的大量重复。此外,由于TriangleVertex结构体不知道结构体Geometry,因此不可能向其中一个TriangleVertex封装该过程的方法添加一个方法——毕竟,它们无法访问适当的HashMap.

我一直在考虑一种通过借来实现这项工作的方法,以便TriangleandVertex对象实际上可以存储对彼此的引用。但是,我在 Rust 方面的经验严重不足,所以我并没有走得太远。一些最初的幼稚方法总是遇到生命周期问题,我什至开始怀疑我当前的设置在 Rust 范式中是否可行。

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

4

0 回答 0