Rust 如何解决编译错误;未为GenFuture实施Unpin”;通过使用组合器调整流而产生的结果?

Rust 如何解决编译错误;未为GenFuture实施Unpin”;通过使用组合器调整流而产生的结果?,rust,Rust,我无法解决如何解决由于使用组合器调整流而导致的编译错误 下面演示了一个相当简单的示例: use futures::prelude::*; use futures::StreamExt; #[derive(Debug)] pub enum Input { A, B(i32), C(u16), } #[derive(Debug)] enum Output { Int(i32), Short(u16), } pub struct StreamMaker;

我无法解决如何解决由于使用组合器调整流而导致的编译错误

下面演示了一个相当简单的示例:

use futures::prelude::*;
use futures::StreamExt;

#[derive(Debug)]
pub enum Input {
    A,
    B(i32),
    C(u16),
}

#[derive(Debug)]
enum Output {
    Int(i32),
    Short(u16),
}

pub struct StreamMaker;

impl StreamMaker {
    /// make a stream with a series of inputs
    pub fn create(self) -> impl Stream<Item = Input> {
        stream::iter(vec![Input::A, Input::C(1u16), Input::B(2)])
    }
}

/// consume the creator, and make output messages for a subset
pub fn adapt_stream(creator: StreamMaker) -> impl Stream<Item = Output> {
    let mut upstream = creator.create();
    upstream.filter_map(|message| async move {
        match message {
            Input::A => None,
            Input::B(v) => Some(Output::Int(v)),
            Input::C(v) => Some(Output::Short(v)),
        }
    })
}

#[tokio::main]
async fn main() -> Result<(), ()> {
    let creator = StreamMaker {};
    let mut stream = adapt_stream(creator);

    while let Some(message) = stream.next().await {
        println!("message: {:?}", message)
    }

    Ok(())
}
use futures::prelude::*;
使用futures::StreamText;
#[导出(调试)]
发布枚举输入{
A.
B(i32),
C(u16),
}
#[导出(调试)]
枚举输出{
Int(i32),
短(u16),
}
pub-struct-StreamMaker;
impl StreamMaker{
///使用一系列输入生成流
pub fn create(self)->impl Stream{
流::iter(vec![输入::A,输入::C(1u16),输入::B(2)])
}
}
///使用创建者,并为子集生成输出消息
pub fn adapt_stream(创建者:StreamMaker)->impl stream{
让mut上游=creator.create();
上游。过滤器映射(|消息|异步移动{
匹配消息{
输入::A=>无,
输入::B(v)=>Some(输出::Int(v)),
输入::C(v)=>Some(输出::Short(v)),
}
})
}
#[tokio::main]
异步fn main()->结果{
让creator=StreamMaker{};
让mut stream=adapt_stream(创建者);
而让一些(消息)=stream.next().等待{
println!(“消息:{:?}”,消息)
}
好(())
}
编译失败,原因是:

error[E0277]:在`impl core::future::future::GenFuture:std::marker::Unpin`中未满足特性绑定`std::future::GenFuture:std::marker::Unpin``
-->src/main.rs:43:38
|
43 | while Some(message)=stream.next().等待{
|^^^^在“impl core::future::future::future”中,没有为“std::future::GenFuture”实现特性“std::marker::Unpin”`
|
=帮助:找到了以下实现:
=注意:必需,因为它出现在类型“impl core::future::future::future”中`
=注意:由于对'futures\u util::stream::filter\u map::FilterMap'的'std::marker::Unpin'impl'的要求,因此必需`
=注意:必需,因为它出现在类型“impl futures\u core::stream::stream”中`
错误[E0277]:在'impl core::future::future::future::future::future'中未满足特性绑定'std::future::GenFuture:std::marker::Unpin'`
-->src/main.rs:43:31
|
43 | while Some(message)=stream.next().等待{
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=帮助:找到了以下实现:
=注意:必需,因为它出现在类型“impl core::future::future::future”中`
=注意:由于对'futures\u util::stream::filter\u map::FilterMap'的'std::marker::Unpin'impl'的要求,因此必需`
=注意:必需,因为它出现在类型“impl futures\u core::stream::stream”中`

=注意:由于“futures\u util::stream::stream::next::next”的“core::future::future::future”impl上的要求,因此需要此选项。如果您不希望流的使用者自己将其锁定,则需要返回实现
Unpin
特征的流,这意味着即使在它被钉住了

pub fn adapt_stream(创建者:StreamMaker)->impl stream+Unpin{
//添加未连接特征--^
此外,编译器应该抱怨返回值没有实现
Unpin
。这是因为
async move{…}
块没有实现
Unpin
,因为它们可能是自引用的(例如,包含对它们自己的变量的引用)。解决此问题的最常用方法是使用
Box::pin
构造函数,使用
pin
将流固定到堆:

pub fn adapt_stream(创建者:StreamMaker)->impl stream+Unpin{
让mut上游=creator.create();
框::pin(上游。过滤器映射(|消息|异步移动{
//^——将流固定到堆
匹配消息{
输入::A=>无,
输入::B(v)=>Some(输出::Int(v)),
输入::C(v)=>Some(输出::Short(v)),
}
}))
}
因为我们现在返回一个指向流的
Pin
指针,所以当内部流保持在同一位置时,该指针可以在内存中安全地移动