如何使用可变的ref作为Item返回Iterator特征?

时间:2019-11-02 02:35:21

标签: rust borrow-checker

我正在尝试返回一个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
        }

    }
}

如果您对这个错误有任何想法,请不要犹豫! :) 谢谢!

0 个答案:

没有答案