以下是一个简单的例子:
struct Connection {}
impl Connection {
fn transaction(&mut self) -> Transaction {
Transaction { conn: self }
}
}
struct Transaction<'conn> {
conn: &'conn Connection,
}
impl<'conn> Transaction<'conn> {
fn commit(mut self) {}
}
fn main() {
let mut db_conn = Connection {};
let mut trans = db_conn.transaction(); //1
let mut records_without_sync = 0_usize;
const MAX_RECORDS_WITHOUT_SYNC: usize = 100;
loop {
//do something
records_without_sync += 1;
if records_without_sync >= MAX_RECORDS_WITHOUT_SYNC {
trans.commit();
records_without_sync = 0;
trans = db_conn.transaction(); //2
}
}
}
编译器在1和2处报告了两个可变借用,但事实并非如此。由于
trans.commit()
将self
按值传递,因此trans
被删除,所以在2点之后不应该存在可变引用。
- 为什么编译器无法看到2处没有可变引用?
- 如何修复代码,保留相同的逻辑?