局部变量的 Rust 异步问题
Rust async issues with local variables
我有这样的方法:
pub async fn build_incoming_stream(&mut self) -> impl Stream<Item = Result<
SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
Box<dyn Error + Send + Sync + 'static>,>,>
{
let addr = self.address.parse::<SocketAddr>()
.expect("Couldn't parse socket address");
let mut listener = TcpListener::bind(addr)
.await
.expect("Couldn't bind address");
let acceptor = self.configure_acceptor()
.await
.expect("configuring acceptor failed");
incoming(listener.incoming(), acceptor.clone())
}
其中fn传入是:
pub fn incoming<S>(incoming: S,acceptor: SslAcceptor,) -> impl Stream<Item =
Result<SslStream<S::Ok>, StreamError>> where
S: TryStream + Unpin,
S::Ok: AsyncRead + AsyncWrite + Send + Sync + Debug + Unpin + 'static,
S::Error: Into<StreamError>,
{
let mut incoming = incoming;
try_stream! {
while let Some(stream) = incoming.try_next().await? {
let tls = tokio_openssl::accept(&acceptor, stream).await?;
let ssl = SslStream {
inner: tls
};
yield ssl;
}
}
}
编译器一直抱怨我不能 return 引用本地数据的值,在 build_incomig_stream fn:
的最后一行
cannot return value referencing local data listener
returns a value referencing data owned by the current function
我试图将它包装在异步移动块中,以捕获侦听器,但没有运气......我有什么想法可以解决或解决这个问题吗?
似乎 tcp 侦听器已经实现了流,所以这段代码有效:
pub async fn build_incoming_stream(
&mut self,
) -> impl Stream<
Item = Result<
SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
Box<dyn Error + Send + Sync + 'static>,
>,
> {
let addr = self
.address
.parse::<SocketAddr>()
.expect("Couldn't parse socket address");
let acceptor = self
.configure_acceptor()
.await
.expect("configuring acceptor failed");
incoming(
TcpListener::bind(addr)
.await
.expect("Couldn't bind address"),
acceptor.clone(),
)
}
有问题的代码问题在
pub fn incoming(&mut self) -> Incoming<'_> {
Incoming::new(self)
}
因为 incoming 将 tcp 侦听器作为可变引用,这导致了麻烦。
我有这样的方法:
pub async fn build_incoming_stream(&mut self) -> impl Stream<Item = Result<
SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
Box<dyn Error + Send + Sync + 'static>,>,>
{
let addr = self.address.parse::<SocketAddr>()
.expect("Couldn't parse socket address");
let mut listener = TcpListener::bind(addr)
.await
.expect("Couldn't bind address");
let acceptor = self.configure_acceptor()
.await
.expect("configuring acceptor failed");
incoming(listener.incoming(), acceptor.clone())
}
其中fn传入是:
pub fn incoming<S>(incoming: S,acceptor: SslAcceptor,) -> impl Stream<Item =
Result<SslStream<S::Ok>, StreamError>> where
S: TryStream + Unpin,
S::Ok: AsyncRead + AsyncWrite + Send + Sync + Debug + Unpin + 'static,
S::Error: Into<StreamError>,
{
let mut incoming = incoming;
try_stream! {
while let Some(stream) = incoming.try_next().await? {
let tls = tokio_openssl::accept(&acceptor, stream).await?;
let ssl = SslStream {
inner: tls
};
yield ssl;
}
}
}
编译器一直抱怨我不能 return 引用本地数据的值,在 build_incomig_stream fn:
的最后一行cannot return value referencing local data
listener
returns a value referencing data owned by the current function
我试图将它包装在异步移动块中,以捕获侦听器,但没有运气......我有什么想法可以解决或解决这个问题吗?
似乎 tcp 侦听器已经实现了流,所以这段代码有效:
pub async fn build_incoming_stream(
&mut self,
) -> impl Stream<
Item = Result<
SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
Box<dyn Error + Send + Sync + 'static>,
>,
> {
let addr = self
.address
.parse::<SocketAddr>()
.expect("Couldn't parse socket address");
let acceptor = self
.configure_acceptor()
.await
.expect("configuring acceptor failed");
incoming(
TcpListener::bind(addr)
.await
.expect("Couldn't bind address"),
acceptor.clone(),
)
}
有问题的代码问题在
pub fn incoming(&mut self) -> Incoming<'_> {
Incoming::new(self)
}
因为 incoming 将 tcp 侦听器作为可变引用,这导致了麻烦。