所以我有这个使用rusqlite的代码.而且效果很好.

pub struct Database {
    conn: Connection,
}

impl Database {
    pub fn get(self: &Self, id: Option<u64>, name: Option<&str>) -> Result<Option<Record>, Error> {

        let mut stmt = match name {
            Some(_) => { self.conn.prepare_cached(Self::STMT_GET_ID_NAME) },
            None => { self.conn.prepare_cached(Self::STMT_GET_ID) }
        }?;

        let mut rows = match name {
            Some(name) => { stmt.query(params![id, name]) },
            None => { stmt.query(params![id]) }
        }?;


        let row = rows.next()?;
        if let Some(row) = row {
            let record = Record { 
                id: row.get(0)?, 
                parent: row.get(1)?, 
                name: row.get(2)?, 
                record_type: row.get(3)?,
                timestamp: row.get(4)?, 
                created_at: row.get(5)?, 
                modified_at: row.get(6)?, 
                size: row.get(7)?, 
                hash: row.get(8)?, 
                inode: row.get(9)? 
            };
            Ok(Some(record))
        } else {
            Ok(None)
        }
    }
}

我遇到的问题是match陈述本质上是重复的.

我try 过这样的事情,但这行不通.

        let (mut stmt, mut rows) = match name {
            Some(name) => {
                let mut stmt = self.conn.prepare_cached(Self::STMT_GET_ID_NAME)?;
                let rows = stmt.query(params![id, name])?;
                (stmt, rows)
            }
            None => {
                let mut stmt = self.conn.prepare_cached(Self::STMT_GET_ID)?;
                let rows = stmt.query(params![id])?;
                (stmt, rows)
            }
        };

问题是编译器抱怨stmt的生命周期

error[E0597]: `stmt` does not live long enough
error[E0505]: cannot move out of `stmt` because it is borrowed

我真的try 了很多东西,并try 疯狂地搜索.但我被困住了.

there甚至是一种不完全丑陋和惯用的方法吗?我觉得这是一个非常愚蠢的问题,而且我在这里错过了一些基本的东西..

推荐答案

问题在于,试图从子表达中"返回"stmtrows会移动stmt,因此使rows所持有的引用无效.为了解决这个问题,您可以省略内部stmt并直接将其分配给火柴臂中的外部stmt.这样,stmt永远不会移动,borrow 判断员很高兴,所以例如,这就编译了:

let mut stmt;
let mut rows = match name {
    Some(name) => {
        stmt = self.conn.prepare_cached(Self::STMT_GET_ID_NAME)?;
        stmt.query(params![id, name])?
    }
    None => {
        stmt = self.conn.prepare_cached(Self::STMT_GET_ID)?;
        stmt.query(params![id])?
    }
};

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

我怎样才能从一个Rust 的日期中go 掉3年?

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

如何从ruust中的fig.toml中读取?

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

Cargo.toml:如何有条件地启用依赖项功能?

Rust,如何从 Rc> 复制内部值并返回它?

信号量释放后 Rust 输出挂起线程

需要哪些编译器优化来优化此递归调用?

Rust中的标记特征是什么?

Rust 程序中的内存泄漏

如何将 C++ 程序链接到 Rust 程序,然后将该 Rust 程序链接回 C++ 程序? (cpp -> rust -> cpp)

我如何取消转义,在 Rust 中多次转义的字符串?

内部值发生变化时 Rc 的行为

为什么1..=100返回一个范围而不是一个整数?

为什么指定生命周期让我返回一个引用?

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

有没有办法阻止 rust-analyzer 使非活动代码变暗?