作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一段代码如下:
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/
我是一名优秀的程序员,十分优秀!