有一个流,我想继续从异步函数(通过 tokio 生成)向其中发送数据包,直到我的主 fn 收到用户输入。然后,包含生成的异步的运行时将关闭,另一个函数应将断开连接数据包发送到流中。
但是我收到一个错误,无法两次借用可变引用。但是接收到第一个可变引用的函数已经终止了,为什么我仍然不能借用新的引用呢?
这是我的主要功能:
fn main() -> io::Result<()> {
let socket_path = "/run/user/1000/discord-ipc-0";
let mut stream = UnixStream::connect(socket_path)?;
let rt = Runtime::new().unwrap();
rt.spawn(update_presence(&mut stream));
{
let mut confirm = String::new();
let _ = io::stdin().read_line(&mut confirm);
}
rt.shutdown_background();
disconnect_stream(&mut stream)?;
Ok(())
}
update_presence()
包含一个 loop{}
,它每隔几秒继续将数据包发送到流中,直到运行时关闭。
您遇到的问题与 Rust 中的借用规则有关。即使函数 update_presence 已终止,流的借用仍然存在,直到调用disconnect_stream 的主函数结束为止。 Rust 不允许您同时对同一数据有多个可变引用,即使其中之一不再被使用。
为了解决这个问题,您可以将主函数分为两个作用域:一个用于 update_presence 函数,另一个用于用户输入和关闭逻辑。以下是修改代码的方法:
use std::io;
use tokio::net::UnixStream;
use tokio::runtime::Runtime;
fn main() -> io::Result<()> {
let socket_path = "/run/user/1000/discord-ipc-0";
let mut stream = UnixStream::connect(socket_path)?;
let rt = Runtime::new().unwrap();
rt.spawn(update_presence(&mut stream));
{
let mut confirm = String::new();
let _ = io::stdin().read_line(&mut confirm);
}
rt.shutdown_background();
disconnect_stream(&mut stream)?;
Ok(())
}
这样,update_presence 的可变借用流包含在与disconnect_stream 的借用不同的范围内,从而解决了借用问题。