我将某些随机几何的蒙特卡罗模拟从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索引)。然后,Triangle
和Vertex
对象将包含其“'成员”ID的向量/数组。然后,可以使用此ID在Triangle
中找到适当的对象。
例如,如果某个HashMap
包含ID为1,2和3的Triangle
,我可以设置变量' vertices'在数组Vertex
的{{1}}对象中。但是,为了以后实际使用Triangle
个对象,我必须随后在[1,2,3]
中查找对象。这将导致整个代码中的大量重复。此外,由于Vertex
和HashMap
结构不了解结构Triangle
,因此无法向Vertex
或Geometry
添加方法将封装此过程 - 毕竟,他们无法访问相应的Triangle
。
我一直在考虑一种借用这种方法来实现这项工作的方法,以便Vertex
和HashMap
对象实际上可以存储彼此的引用。但是,我对Rust的经验非常缺乏,所以我没有走得太远。一些最初的天真方法总是遇到生命周期的问题,我甚至开始怀疑我目前的设置在Rust范例中是否可行。
对我问题的任何部分的所有反馈都非常欢迎。理想情况下,我正在寻找关于如何在我的思路中实施某些事情的具体建议,但如果你认为我应该重新考虑我的整个方法,那么我也很高兴听到这个。