#rust
Вопрос:
Чтобы реализовать итератор для структуры, которая имеет срез со сроком службы, мне пришлось сделать
struct S<'a, T> {
inner: amp;'a mut [T],
}
impl<'a, T> Iterator for S<'a, T> {
type Item = amp;'a mut T;
fn next(amp;mut self) -> Option<Self::Item> {
let temp = std::mem::take(amp;mut self.inner);
let (first, rest) = temp.split_first_mut()?;
self.inner = rest;
Some(first)
}
}
При написании этого кода я понял, что lifetime обеспечивает дополнительную копию памяти(mem::take), которая была бы ненужной в C или C . Я что-то здесь упускаю или это небольшая цена, которую ржавчина платит за всю жизнь?
Комментарии:
1. Какой аналогичный код C вы себе представляете, который не копируется
inner
? (Имея в видуinner
, что это просто ссылка , а не данные)2. @trentcl:
std::slice::IterMut
избегает создания временного, но вместо этого использует необработанные указатели и небезопасные операции… @pandawithcat, почему бы не создатьinner
экземпляр этого и просто делегировать ему?3. почему бы вам не использовать какой-нибудь… индекс ? play.rust-lang.org/…
Ответ №1:
- Ненужные копии должны быть оптимизированы LLVM.
mem::take<T>
требует, чтобыT
impl
sDefault
, поэтому не рассматривайте это как общее решение.