我正在将某些随机几何的蒙特卡罗模拟从 Python 转换为 Rust。我在 Python 中拥有的自由让我在整个代码中存储对其他对象的引用有点草率,但这似乎在 Rust 中实现起来更棘手。
在我当前的 Python 实现中,主要对象是Geometry
. 它包含一个Vertex
带有唯一 ID 的 es 字典(ID 也是它在字典中的查找键)和一个Triangle
s 字典(与 for 相同的场景Vertex
)。EveryTriangle
包含三个Vertex
es 的列表(这次没有字典,这里是有序列表),并且 everyVertex
包含它出现的所有 s 的字典(再次由的唯一 IDTriangle
索引)。Triangle
这导致了大量的交叉引用,但它确实使查找内容变得非常容易。例如,通过简单地遍历它出现的所有 s 并收集这些s中包含的所有 es,可以直接找到Vertex
特定的所有相邻 es 。Vertex
Triangle
Vertex
Triangle
为方便起见,以下是数据结构的摘要:
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 在.Vertex
Triangle
Vertex
Triangle
HashMap
例如,如果某个Triangle
包含Vertex
ID 为 1、2 和 3 的 es,我可以将Triangle
对象中的变量 'vertices' 设置为数组[1,2,3]
。但是,为了之后实际使用这些Vertex
对象,我必须随后在HashMap
. 这将导致整个代码中的大量重复。此外,由于Triangle
和Vertex
结构体不知道结构体Geometry
,因此不可能向其中一个Triangle
或Vertex
封装该过程的方法添加一个方法——毕竟,它们无法访问适当的HashMap
.
我一直在考虑一种通过借来实现这项工作的方法,以便Triangle
andVertex
对象实际上可以存储对彼此的引用。但是,我在 Rust 方面的经验严重不足,所以我并没有走得太远。一些最初的幼稚方法总是遇到生命周期问题,我什至开始怀疑我当前的设置在 Rust 范式中是否可行。
非常欢迎对我的问题的任何部分提供所有反馈。理想情况下,我正在寻找一个关于如何按照我的思路实现某些东西的具体建议,但如果你认为我应该重新考虑我的整个方法,那么我也会很高兴听到这个消息。