[英]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;
}
}
}
編譯器一直抱怨我無法在 build_incomig_stream fn 的最后一行返回引用本地數據的值:
無法返回引用本地數據
listener
器的值返回引用當前 function 擁有的數據的值
我試圖將它包裝在異步移動塊中以捕獲偵聽器,但沒有運氣......任何想法我該如何解決或解決這個問題?
似乎 tcp 監聽器已經實現了 stream,所以這段代碼有效:
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)
}
因為傳入將 tcp 偵聽器作為可變引用,這造成了麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.