如何在Rust中的同一结构中存储rusqlite连接和语句对象?

如何在Rust中的同一结构中存储rusqlite连接和语句对象?,rust,Rust,我正在开发我的第一个Rust程序,并且已经与Rust所有权语义发生冲突。我已经声明了一个struct,它将封装一个SQLite数据库连接,以便它维护一个连接成员。出于性能原因,我还希望保留一个准备好的语句,由语句类型表示。以下是我的代码的简化版本: extern crate rusqlite; // 0.14.0 use rusqlite::{Connection, Statement}; pub struct Foo<'a> { conn: Connection,

我正在开发我的第一个Rust程序,并且已经与Rust所有权语义发生冲突。我已经声明了一个
struct
,它将封装一个SQLite数据库连接,以便它维护一个
连接
成员。出于性能原因,我还希望保留一个准备好的语句,由
语句
类型表示。以下是我的代码的简化版本:

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 }
    }
}
由于某种原因,
rusqlite::Connection
类型不接受生存期参数,因此我无法将其生存期与
语句的生存期明确关联

我错过了什么?这种封装是一种非常常见的模式,我确信我遗漏了一些东西。

让我们看看:


pub fn prepare result这与问“我如何引用‘foo’然后移动‘foo’?”的众多问题中的任何一个问题相同。还有。简短的版本是,一旦你对某个项目有了引用,你就不能移动该项目,因为这会使引用无效。谢谢你的评论。也许我误解了命名法,但在我的示例中,我认为我没有使用引用。我打算将
SqliteConnection
的所有权从
new
函数的范围转移到
Foo
结构,该结构本身由
new
函数的调用方拥有。我建议将您的标题更改为更具体的内容,如“如何在同一个结构中拥有
SqliteStatement
SqliteConnection
“。就目前而言,您的标题不够集中,因为将所有权转移到结构很容易,但这不是您的问题所在。如果我们将最佳答案定义为向我明确说明为什么我试图做的事情在设计上是不可能的答案,那么您对这个问题的回答肯定是最好的。我看到了另一个问题,但我没有理解我所尝试的实际上是同一件事的方式。我看到了另一个问题——我怀疑,因为这个问题是在这个问题被提出5天后提出的^_^啊哈!这就是我错过的。谢谢。sql连接+2准备好的语句在实际代码中到底是什么样子的?您将如何实现“一个可以引用另一个”?我是否只需要将代码中没有连接的变量传递给任何我想要原始问题中的
Foo
。通常,您可以只将包含引用的项目传递给另一个项目,然后访问引用的项目。@Shepmaster谢谢。在本例中(rusqlite连接和语句),语句具有对该连接的引用,但不公开它。
pub fn prepare<'a>(&'a self, sql: &str) -> Result<Statement<'a>>