各位大佬好
学习中遇到这样的代码 使用了 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 为什么这样使用 ? 初学小白,莫怪 莫怪
评论区
写评论非常感谢您的回复,我是新手。这个是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: 你把这两个函数的代码贴出来,应该都有文档注释吧。
你把这两个函数的代码贴出来,应该都有文档注释吧。