< 返回版块

qianjunjushi 发表于 2021-08-25 16:48

Tags:async ,pin, pin_project

各位大佬好 学习中遇到这样的代码 使用了 pin_project 宏 里面有project 和project_replace 两个,这两个实在费解,我的理解是 pin_project 是把结构体pin住,有些field 是pin的 有些不是 pin_project! { /// Internal Map future #[project = MapProj] #[project_replace = MapProjReplace] #[derive(Debug)] #[must_use = "futures do nothing unless you .await or poll them"] pub enum Map<Fut, F> { Incomplete { #[pin] future: Fut, f: F, }, Complete, } }

代码后面是用的时候是这样 impl<Fut, F, T> Future for Map<Fut, F> where Fut: Future, F: FnOnce1<Fut::Output, Output = T>, { type Output = T;

fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<T> {
    match self.as_mut().project() {
        MapProj::Incomplete { future, .. } => {
            let output = ready!(future.poll(cx));
            match self.project_replace(Map::Complete) {
                MapProjReplace::Incomplete { f, .. } => Poll::Ready(f.call_once(output)),
                MapProjReplace::Complete => unreachable!(),
            }
        }
        MapProj::Complete => {
            panic!("Map must not be polled after it returned `Poll::Ready`")
        }
    }
}

}

代码中分别使用了project_replace 和project 为什么这样使用 ? 初学小白,莫怪 莫怪

评论区

写评论
作者 qianjunjushi 2021-08-26 08:40

非常感谢您的回复,我是新手。这个是futures 里面的源码,我在阅读源码的时候看到这里不明白,所以才来提问的。 源码在https://github.com/rust-lang/futures-rs/blob/master/futures-util/src/future/future/map.rs 的第11行 和12行,然后在第54行 57行使用了 我然后去读了 pin_project 里面有大量的宏,对于我这个新手来说 宏还没有涉及到,所以我来请教能否告诉我大概的概念,这两句话什么意思,我先概念性理解,然后再逐步深入 主要是对 pin_project 里面的宏 不是很理解

👇
chenge: 你把这两个函数的代码贴出来,应该都有文档注释吧。

chenge 2021-08-25 21:00

你把这两个函数的代码贴出来,应该都有文档注释吧。

1 共 2 条评论, 1 页