【发布时间】:2021-05-19 05:21:58
【问题描述】:
我创建了一个连接类型,即
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 函数是否正确?
我不想将所有权转让给此函数。我想我只是想让函数借用连接。
【问题讨论】:
-
这里有几个问题,你应该问 code_review 而不是 SO。回答最明确的问题:
&mut不会“转让所有权”,而是让函数拥有对其的临时独占访问权,这是连接和类似资源的常见模式。
标签: design-patterns rust rusqlite