Я пытаюсь вернуть черту Iterator
с изменяемым реф как item
. И я не могу понять, почему у меня эта ошибка компилятора cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
, а также expected &mut T, found &mut T
для этого кода:
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
self.handles
.iter_mut()
.filter(|h| h.is_dirty == false)
.map(move |h| &mut self.data[h.value])
}
Кроме того, его неизменная версия хорошо работает без каких-либо ошибок компилятора:
pub fn iter(&self) -> impl Iterator<Item = &T> {
self.handles
.iter()
.filter(|h| h.is_dirty == false)
.map(move |h| &self.data[h.value])
}
Я пытался уточнить компилятор с некоторыми временами жизни, но я продолжаю иметь эту ошибку.
Я настраиваю игровую площадку здесь https://play.rust -lang.org /? Version = stable & mode = debug & edition = 2018 & gist = 3e399936f341d26c742a5e7e0bac4d89 (L138).
Также,Я пытался реализовать метод iter_mut()
самостоятельно (как https://doc.rust -lang.org / src / core / slice / mod.rs.html # 560 ), но безуспешно. Та же самая ошибка, и даже если я обойду эту ошибку, будет определена область handles
, поэтому время жизни не будет следовать.
pub fn iter_mut(&mut self) -> IterMut<'_, &T> {
let handles: Vec<&T> = self.handles
.iter()
.filter(|h| h.is_dirty == false)
.map(move |h| &self.data[h.value])
.collect();
unsafe {
let ptr = handles.as_mut_ptr();
let end = ptr.add(handles.len());
IterMut {
ptr,
end,
_marker: marker::PhantomData
}
}
}
Если кто-то из вас имеет представление об этой ошибке, не стесняйтесь! :) Спасибо!