Несколько владельцев для элементов списка Rust (владелец списка и несколько рефереров) - возможно?

У нас есть структура с LinkedList:

struct XPipeline {
    handlers: LinkedList<XHandler>,
}

XPipeline является владельцем всех XHandler объектов и может обращаться к ним и изменять их.

У нас уже есть список обработчиков; теперь нам нужно, чтобы каждый обработчик мог ссылаться на своих соседей в списке. А именно, каждый метод обработчика может обращаться к соседям обработчика, изменять их и вызывать их методы.

Мои первые мысли были такими: я предоставляю каждому обработчику поля prev и next, которые будут относиться к соседям. Добавляя новый обработчик в список, я инициализирую эти поля соответствующими ссылками. Теперь я могу использовать эти ссылки во всех методах обработчика. (Это было бы легко в C ++ с указателями).

Проблема в том, что разрешен только один владелец (т.е. с разрешением на изменение). И этот владелец (всех обработчиков) уже является объектом XPipeline. Как я мог это решить? Возможно, наняв:

handlers: Rc<RefCell<LinkedList<XHandler>>>

Но как именно?


person Dr. Andrey Belkin    schedule 14.07.2016    source источник
comment
Пожалуйста, отредактируйте свой вопрос на покажите, какое исследование вы провели, прежде чем задавать этот вопрос. На главной странице еще один вопрос о круговом связанном списке. tagged / rust "> rust вопросы, когда вы задали это; чем это отличается? Как насчет 50 или около того других вопросов о связанных списках ржавчины; может быть, некоторые из них будут полезны? Как только мы узнаем, что сбивает с толку во всех существующих ответах, мы сможем дать вам полезный ответ для вашей уникальной проблемы.   -  person Shepmaster    schedule 14.07.2016
comment
Я просмотрел предоставленные ссылки и не нашел ответа. Все вопросы были на другие темы. Например, связан с другим циклом -список вопроса о реализации списка с своего рода итератором. Я спрашиваю: у меня есть стандартный общий LinkedList + каждый элемент может напрямую ссылаться на своих соседей (так что это своего рода двойной двунаправленный список).   -  person Dr. Andrey Belkin    schedule 15.07.2016
comment
Похоже, вы ищете навязчивую структуру данных.   -  person llogiq    schedule 15.07.2016


Ответы (1)


Одна из стратегий в Rust для множественных ссылок в структурах данных - использовать Vec<T> в качестве резервного хранилища и затем индексировать его с помощью usize "указателей".

Ваш случай будет выглядеть примерно так:

struct XPipeline {
    head: usize,
    storage: Vec<Node>,
}

struct Node {
    handler: XHandler,
    next: Option<usize>,
    prev: Option<usize>,
}

Бухгалтерия очень похожа на указатели, которые вы использовали бы в C ++.

Также ознакомьтесь с этим обсуждением на Reddit, чтобы узнать, как справиться с владение графоподобными структурами.

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

person apopiak    schedule 16.07.2016
comment
также ознакомьтесь с книгой связанных списков - person apopiak; 17.07.2016