Каков наилучший подход для нескольких перекрестных ссылок в Rust?
Я конвертирую симуляцию Монте-Карло некоторых случайных геометрий из Python в Rust. Свобода, которую я имел в Python, позволила мне быть немного небрежным в отношении хранения ссылок на другие объекты по всему моему коду, но это кажется более хитрым для реализации в Rust.
В моей текущей реализации Python основным объектом является Geometry
, Он содержит словарь Vertex
ES с уникальным идентификатором (идентификатор также является ключом поиска в словаре) и словарем Triangle
s (тот же сценарий, что и для Vertex
). каждый Triangle
содержит список из трех Vertex
ES (на этот раз нет словаря, здесь это упорядоченный список), и каждый Vertex
содержит словарь всех Triangle
s, в которых он появляется (снова индексируется Triangle
уникальный идентификатор).
Это приводит к большому количеству перекрестных ссылок, но позволяет легко находить вещи. Например, легко найти все соседние Vertex
эс конкретного Vertex
просто перебирая все Triangle
s он появляется и собирает все Vertex
ES, которые содержатся в этих Triangle
s.
Для удобства ниже приведено краткое описание структур данных:
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
возражать против члена HashMap
из Vertex
эс и Triangle
s, как в моем коде Python (снова индексируется по ID). Vertex
а также Triangle
тогда объекты будут содержать вектор / массив идентификаторов своих "членов". Этот идентификатор может быть использован для поиска соответствующего объекта в HashMap
,
Например, если определенный Triangle
содержит Vertex
Кроме того, с идентификаторами 1, 2 и 3, я мог бы установить переменную "вершины" в Triangle
объект в массив [1,2,3]
, Однако для того, чтобы на самом деле работать с Vertex
объекты впоследствии, я должен был бы впоследствии искать объект в HashMap
, Это привело бы к многократному повторению всего кода. Кроме того, так как Triangle
а также Vertex
структуры не знают о структуре Geometry
, будет невозможно добавить метод либо Triangle
или же Vertex
который будет инкапсулировать этот процесс - в конце концов, они не могут получить доступ к соответствующим HashMap
,
Я думал о способе сделать эту работу с заимствованиями, чтобы Triangle
а также Vertex
объекты могут фактически хранить ссылку друг на друга. Тем не менее, мой опыт работы с Rust сильно отсутствует, поэтому я не слишком далеко ухожу. Некоторые первоначальные наивные подходы всегда сталкивались с проблемами времени жизни, и я даже начинаю сомневаться в том, что моя текущая установка вообще работает в парадигме Rust.
Все отзывы по любой части моего вопроса будут приветствоваться. В идеале я ищу конкретное предложение о том, как реализовать что-то в моем направлении мышления, но если вы поймете, что я должен переосмыслить весь свой подход, то я также был бы очень рад услышать это.