我正在开发我的第一个Rust程序,与Rust所有权语义发生冲突.我已经声明了一个struct
,它将封装一个SQLite数据库连接,因此它维护一个Connection
成员.出于性能方面的考虑,我还想保留一个预先准备好的语句,用Statement
类型表示.以下是我的代码的简化版本:
extern crate rusqlite; // 0.14.0
use rusqlite::{Connection, Statement};
pub struct Foo<'a> {
conn: Connection,
statement: Statement<'a>,
}
impl<'a> Foo<'a> {
pub fn new() -> Foo<'a> {
let conn = Connection::open(&":memory:").unwrap();
let statement = conn
.prepare("INSERT INTO Foo(name, hash) VALUES($1, $2)")
.unwrap();
Foo { conn, statement }
}
}
我试图将conn
变量的所有权转移给被调用方,方法是将其存储在Foo
的一个成员中,但当我试图编译这段代码时,它失败了:
error[E0597]: `conn` does not live long enough
--> src/main.rs:13:25
|
13 | let statement = conn
| ^^^^ borrowed value does not live long enough
...
17 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 10:6...
--> src/main.rs:10:6
|
10 | impl<'a> Foo<'a> {
| ^^
由于某些原因,rusqlite::Connection
类型不接受生存期参数,因此我无法显式地将其生存期与Statement
实例的生存期联系起来.
我错过了什么?这种封装是一种非常常见的模式,我确信我遗漏了一些东西.