gpt4 book ai didi

rust - 如何为 Box> 使用 map ?

转载 作者:行者123 更新时间:2023-12-03 11:25:54 26 4
gpt4 key购买 nike

我有一段代码如下:

fn stream_it(&self) -> Box<dyn Stream<Item=()>> {
Box::new(self.some_field)
}

fn consume_it(&self) {
let a = self.stream_it().map(|i| i);
}

我收到编译错误:

error: the `map` method cannot be invoked on a trait object
--> ...
|
69 | let a = self.stream_it().map(|i| i);
| ^^^
|
::: ...
|
257 | Self: Sized,
| ----- this has a `Sized` requirement
|
= note: other candidates were found in the following traits, perhaps add a `use` for one_of_them:
candidate #1: `use futures_util::future::future::FutureExt;`
candidate #2: `use futures_signals::signal::signal::SignalExt;`
candidate #3: `use futures_util::stream::stream::StreamExt;`
candidate #4: `use futures_signals::signal_vec::SignalVecExt;`
candidate #5: `use async_std::stream::stream::StreamExt;`

据了解, Sized要求是必要的,但我不知道如何满足它。甚至可以映射单元流吗?

最佳答案

如果你看 StreamExt::map 的定义,由实现 Stream 的类型自动实现,你会看到这个:

fn map<T, F>(self, f: F) -> Map<Self, F>
where
F: FnMut(Self::Item) -> T
换句话说, map取得 self 的所有权.但是 Box<dyn Stream>不实现 Stream ,因此它将尝试使用 dyn Stream其中包含的值(value)。但这是一个 trait 对象,它是一个无大小的类型,永远不可能是 self没有引用的参数,因此您的编译器错误。
这里的解决方案是将返回类型更改为 Pin<Box<dyn Stream<Item = ()>>> ,它确实实现了 Stream :
use std::pin::Pin;

fn stream_it() -> Pin<Box<dyn Stream<Item=()>>> {
// ^-- add Pin<...> here
Box::pin(futures::stream::iter(vec![(), (), ()]))
// ^-- use Box::pin instead of Box::new
}
或者,您也可以将返回类型更改为 Box<dyn Stream<Item = ()> + Unpin> ,这也实现了 Stream ,但对返回的流提出了一些额外的要求(即它实现了 Unpin,因此在内存中移动是安全的),所以它通常不太可取。

关于rust - 如何为 Box<dyn Stream<Item=()>> 使用 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61264860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com