【发布时间】:2022-09-23 12:52:37
【问题描述】:
我有一个结构,其中包含一个用于通信的 TcpStream 和一个用于接收数据的 BytesMut。 当我需要使用它来接收数据时,我打算做以下事情。
#[tokio::test]
async fn test_refmut1() {
struct Ctx {
tcps: TcpStream,
data: BytesMut,
}
async fn recv(ctx: Arc<Mutex<Ctx>>) {
let mut ctx = ctx.lock().await;
ctx.tcps.read_buf(&mut ctx.data).await.unwrap();
}
}
显然这样是编译不过去的,因为tcps借了一次,又借了BytesMut,也就是read_buf()参数。
像往常一样,我使用RefCell 包裹另一部分以获得内部可变性。
#[tokio::test]
async fn test_refmut2() {
struct Ctx {
tcps: TcpStream,
data: RefCell<BytesMut>,
}
async fn recv(ctx: Arc<Mutex<Ctx>>) {
let mut ctx = ctx.lock().await;
let tcps = &ctx.tcps;
let mut data = ctx.data.borrow_mut();
ctx.tcps.read_buf(&data).await.unwrap();
}
}
但是,这仍然无法编译,因为read_buf() 需要&mut BytesMut 类型的参数,我现在通过RefCell 借用它作为RefMut<BytesMut> 类型的参数。
但我知道这两者不能直接兑换,我该怎么办?
-
第一个例子中的
ctx.tcps和ctx.data应该是不相交的借用。为什么不编译?
标签: rust mutex borrow-checker