在 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 中的工作方式)。这比借用连接更不符合人体工学。
我创建了一个连接类型,即
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 中的工作方式)。这比借用连接更不符合人体工学。