1

我创建一个连接类型,即

let mut conn = Connection::open("sqlite.db").unwrap();

然后我将该类型与向量一起传递给我的 save_all 函数,如下所示:

pub fn save_all(conn: &mut Connection,
                vehicles: Vec<Vehicle>) -> Result<(), Error> {
    let tx = conn.transaction()?;
    for v in vehicles {
        let sql: &str =
            "INSERT INTO local_edits (vehicle_id, make, model, color)
                 VALUES (:vehicle_id, :make, :model, :color)";
        let mut statement = tx.prepare(sql)?;
        statement.execute(named_params! {
                ":vehicle_id": v.vehicle_id,
                ":make": v.make,
                ":model": v.model,
                ":color": v.color})?;
    };
    tx.commit()?;
    return Ok(());
}

这段代码似乎工作正常。这段代码真的正确吗?

如果我不在函数中创建我的conntype &mut Connection save_all,则代码不会为我编译。它告诉我:

Cannot borrow immutable local variable `conn` as mutable

我不太确定如何理解这一点。

将 conn 的“引用”传递给我的save_all函数是否正确?

我不想将所有权转让给这个函数。我想我只是想让函数借用连接。

4

1 回答 1

2

不能将不可变的局部变量借用conn为可变的

mutin是必要的,因为您正在&mut Connection调用它需要一个可变引用。另请参阅此 API 调用的文档,该调用需要.transactionconn&mut self

借款与所有权转让

如果您想稍后再次使用连接,借用似乎是正确的方法。如果您要转移连接的所有权,则必须将其作为结果的一部分再次返回,以便以后重新使用它(因为 rust 中的仿射类型如何工作)。与仅借用连接相比,这将不太符合人体工程学。

于 2021-05-19T05:44:42.063 回答