Каков наилучший подход для нескольких перекрестных ссылок в Rust?

Я конвертирую симуляцию Монте-Карло некоторых случайных геометрий из Python в Rust. Свобода, которую я имел в Python, позволила мне быть немного небрежным в отношении хранения ссылок на другие объекты по всему моему коду, но это кажется более хитрым для реализации в Rust.

В моей текущей реализации Python основным объектом является Geometry, Он содержит словарь VertexES с уникальным идентификатором (идентификатор также является ключом поиска в словаре) и словарем Triangles (тот же сценарий, что и для Vertex). каждый Triangle содержит список из трех VertexES (на этот раз нет словаря, здесь это упорядоченный список), и каждый Vertex содержит словарь всех Triangles, в которых он появляется (снова индексируется Triangleуникальный идентификатор).

Это приводит к большому количеству перекрестных ссылок, но позволяет легко находить вещи. Например, легко найти все соседние Vertexэс конкретного Vertex просто перебирая все Triangles он появляется и собирает все VertexES, которые содержатся в этих Triangles.

Для удобства ниже приведено краткое описание структур данных:

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эс и Triangles, как в моем коде 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.

Все отзывы по любой части моего вопроса будут приветствоваться. В идеале я ищу конкретное предложение о том, как реализовать что-то в моем направлении мышления, но если вы поймете, что я должен переосмыслить весь свой подход, то я также был бы очень рад услышать это.

0 ответов

Другие вопросы по тегам