我正在尝试返回一个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
}
}
}
如果您对这个错误有任何想法,请不要犹豫! :) 谢谢!