如何在 Rust 中引用 impl 输出的类型?
How to refer to type of impl output in Rust?
我正在尝试在 Rust 中实现一个用于补品 GRPC 处理程序的流,但遇到了这个困难:大多数创建流的方法都没有易于表达的类型,但我需要实现的 GRPC 特征需要特定的 Stream 类型。像这样(简化):
// trait to implement
trait GrpcHandler {
type RespStream: futures::Stream<ResponseType> + Send + 'static
fn get_resp_stream() -> Self::RespStream;
}
// a start at implementing it
impl GrpcHandler for MyHandler {
type RespStream = ???; // what do I put here?
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
}
}
我知道我的流类型在技术上类似于 Unfold<(), ComplicatedFnSignatureWithImpl, ComplicatedFutureSignatureWithImpl>
,但即使我输入了整个内容,编译器也不会因为它是不透明类型而感到高兴。
我怎样才能引用这个流的类型?
不幸的是,在没有动态调度的情况下,稳定的 Rust 没有好的方法来做到这一点。您必须使用 dyn Stream
,而 futures
为此提供 BoxStream
:
impl GrpcHandler for MyHandler {
type RespStream = futures::stream::BoxStream<'static, ResponseType>;
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
.boxed()
}
}
如果你每晚使用,你可以使用不稳定的type_alias_impl_trait特性来避免动态调度的开销:
#![feature(type_alias_impl_trait)]
impl GrpcHandler for MyHandler {
type RespStream = impl futures::Stream<Item = ResponseType> + Send + 'static;
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
}
}
我正在尝试在 Rust 中实现一个用于补品 GRPC 处理程序的流,但遇到了这个困难:大多数创建流的方法都没有易于表达的类型,但我需要实现的 GRPC 特征需要特定的 Stream 类型。像这样(简化):
// trait to implement
trait GrpcHandler {
type RespStream: futures::Stream<ResponseType> + Send + 'static
fn get_resp_stream() -> Self::RespStream;
}
// a start at implementing it
impl GrpcHandler for MyHandler {
type RespStream = ???; // what do I put here?
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
}
}
我知道我的流类型在技术上类似于 Unfold<(), ComplicatedFnSignatureWithImpl, ComplicatedFutureSignatureWithImpl>
,但即使我输入了整个内容,编译器也不会因为它是不透明类型而感到高兴。
我怎样才能引用这个流的类型?
不幸的是,在没有动态调度的情况下,稳定的 Rust 没有好的方法来做到这一点。您必须使用 dyn Stream
,而 futures
为此提供 BoxStream
:
impl GrpcHandler for MyHandler {
type RespStream = futures::stream::BoxStream<'static, ResponseType>;
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
.boxed()
}
}
如果你每晚使用,你可以使用不稳定的type_alias_impl_trait特性来避免动态调度的开销:
#![feature(type_alias_impl_trait)]
impl GrpcHandler for MyHandler {
type RespStream = impl futures::Stream<Item = ResponseType> + Send + 'static;
fn get_resp_stream() -> Self::RespStream {
futures::stream::unfold((), |_| async {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
Some((ResponseType {}, ()))
})
}
}