在 Rust 中传递类型的惯用方式是什么?

What's the idiomatic way to pass types in Rust?

我创建了一个连接类型,即

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(());
}

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

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

Cannot borrow immutable local variable `conn` as mutable

我不太确定如何理解这个。

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

我不想将所有权转让给此功能。我想我只是想让函数借用连接。

Cannot borrow immutable local variable conn as mutable

&mut Connection 中的 mut 是必需的,因为您在 conn 上调用 transaction,这需要可变引用。另请参阅 documentation for this API callI,它需要 &mut self

Borrowing vs. transfer of ownership

借用似乎是执行此操作的正确方法,以防您想稍后再次使用该连接。如果你要转移连接的所有权,你必须再次 return 它作为结果的一部分,以便以后重新使用它(因为仿射类型在 Rust 中的工作方式)。这比借用连接更不符合人体工学。