Нужно ли создавать различные структуры как для собственных (простых в использовании), так и заимствованных (более эффективных) структур данных? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть Message<'a>, у которого есть &'a str ссылки на в основном недолговечный буфер. Эти ссылки предписывают определенный c программный поток, поскольку они гарантированно никогда не переживут время жизни 'a буфера.

Теперь я также хочу иметь собственную версию Message, так что она может перемещаться, отправляться через потоки и т. д. c.

Существует ли способ достижения этой цели? Я думал, что Cow<'a, str> может помочь, но, к сожалению, Cow магически не выделяется в случае, если &'a str переживет время жизни буфера.

AFAIK, Cow не является особенным в том смысле, что независимо от того, если Cow содержит вариант Owned, он все равно должен пройти проверку заимствования на 'a.

Определение std::borrow::Cow.

pub enum Cow<'a, B> {
    Borrowed(&'a B),
    Owned(<B as ToOwned>::Owned),
}

Есть идиоматизм c способ иметь собственный вариант Message? По какой-то причине у нас есть &str и String, &[u8] и Vec<u8>, ... означает ли это, что люди обычно go для &msg и Message?

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

1 Ответ

3 голосов
/ 30 марта 2020

Да, вам нужно иметь несколько типов, один из которых представляет принадлежащую концепцию, а другой представляет заимствованную концепцию.

Вы увидите ту же технику в стандартной библиотеке и сторонних ящиках.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...