[英]How can I specify a trait bound on an associated type that is a Result?
I'm trying to write a function that can take a Stream
that returns Result
s.我正在尝试编写一个可以采用返回Result
的Stream
的函数。 The trouble is in specifying boundaries for the success values of the Result
.问题在于为Result
的成功值指定边界。
This is an example that illustrates the problem (yes, it won't run without an async runtime, but that's not really the issue at hand):这是一个说明问题的示例(是的,它不会在没有异步运行时的情况下运行,但这并不是真正的问题):
use std::{pin::Pin, task::{Context, Poll}};
use futures::{Stream, StreamExt};
struct Data;
impl Stream for Data {
type Item = Result<String, std::io::Error>;
#[inline]
fn poll_next(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<Self::Item>> {
Poll::Ready(Some(Ok("Hello".to_owned())))
}
}
async fn handle_stream<S>(mut stream: S) where S: Stream + Unpin, <S as Stream>::Item: AsRef<str> {
while let Some(item) = stream.next().await {
// TODO
}
}
fn main() {
let mut data = Data{};
async move {
handle_stream(data).await;
};
}
The compiler error below makes sense, since Result
does not implement AsRef
:下面的编译器错误是有道理的,因为Result
没有实现AsRef
:
error[E0277]: the trait bound `Result<String, std::io::Error>: AsRef<str>` is not satisfied
--> src/main.rs:24:5
|
24 | handle_stream(data).await;
| ^^^^^^^^^^^^^ the trait `AsRef<str>` is not implemented for `Result<String, std::io::Error>`
|
note: required by a bound in `handle_stream`
--> src/main.rs:15:88
|
15 | async fn handle_stream<S>(mut stream: S) where S: Stream + Unpin, <S as Stream>::Item: AsRef<str> {
| ^^^^^^^^^^ required by this bound in `handle_stream`
For more information about this error, try `rustc --explain E0277`.
But my attempts to specify that the associated Item
for S
should actually be a Result
fail, since Result
is not a trait:但是我试图指定S
的关联Item
实际上应该是Result
失败,因为Result
不是特征:
error[E0404]: expected trait, found enum `Result`
--> src/main.rs:15:88
|
15 | async fn handle_stream<S>(mut stream: S) where S: Stream + Unpin, <S as Stream>::Item: Result<AsRef<str>> {
| ^^^^^^^^^^^^^^^^^^ not a trait
For more information about this error, try `rustc --explain E0404`.
How can I specify that I want Stream
s that return Result
s that have AsRef<str>
values?如何指定我想要返回具有AsRef<str>
值的Result
的Stream
? I realize I will likely need to specify something for the Err
type as well;我意识到我可能还需要为Err
类型指定一些东西; assuming that's a similar syntax.假设这是一个类似的语法。
The syntax for equating associated types is Trait<Assoc = Type>
.等同关联类型的语法是Trait<Assoc = Type>
。
So:所以:
async fn handle_stream<S, I, E>(mut stream: S)
where
S: Stream<Item = Result<I, E>> + Unpin,
I: AsRef<str>,
{
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.