Как реализовать структуру в Rust, которая имеет список в виде поля - PullRequest
0 голосов
/ 17 июня 2020

Я начал изучать Rust и сейчас пытаюсь написать небольшую нейронную сеть в качестве личного упражнения. Я хочу определить структуру для моих будущих слоев / кластеров / групп узлов. Мое первоначальное определение выглядит так:

struct Layer {
    name: String,  // Human readable name
    id: String,  // UUID in the future
    order: u8,  // int for sorting
    width: u8,  // Number of nodes
    input: [&'Self],  // References to other Layers that feed input into this
}

Я борюсь с полем input, которое должно содержать список ссылок на другие экземпляры Layer. Я буду знать во время компиляции, сколько каждого слоя будет иметь в списке, поэтому мне не придется изменять его. Можно ли это сделать? Не могу найти решение на машине Google или в "книге".

Посоветуйте, пожалуйста.

1 Ответ

4 голосов
/ 17 июня 2020

Можно ли это сделать? Я не могу найти решение на машине Google или в «книге».

Возможно да, хотя я бы не рекомендовал это.

Начнем с возможного: &Self будет «ссылкой на слой» с безымянным временем жизни, имя времени жизни - для формы '<symbol>, поэтому, когда вы пишете &'Self, вы указываете ссылку времени жизни 'Self, но никогда не указываете type , поэтому ржавчина c жалуется на «ожидаемый тип».

Если вы добавите «правильное» имя времени жизни и параметризуете структуру, она компилируется нормально:

struct Layer<'sublayers> {
    name: String,  // Human readable name
    id: String,  // UUID in the future
    order: u8,  // int for sorting
    width: u8,  // Number of nodes
    input: [&'sublayers Self],  // References to other Layers that feed input into this
}

Однако Я бы не рекомендовал его, поскольку последний член, являющийся срезом, означает, что это DST , с которым трудно работать в лучшем случае - поскольку nomicon особо отмечает, что «пользовательские DST - это в значительной степени недоработанная функция». либо (например, Layer<const Size> и input: [&Self;Size], возможно, на e день), поэтому вам, вероятно, понадобится что-то вроде ссылки на вектор или срез, например

struct Layer<'slice, 'sublayers: 'slice> {
    name: String,  // Human readable name
    id: String,  // UUID in the future
    order: u8,  // int for sorting
    width: u8,  // Number of nodes
    input: &'slice [&'sublayers Self],  // References to other Layers that feed input into this
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...