微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rust:闭包组合所有权

如何解决Rust:闭包组合所有权

为了避免嵌套匹配,我尝试对 and_then 使用 Result 方法。当我尝试转换这个时出现问题

match Connection::open(&db_path) {
    Ok(conn) => {
        match conn.prepare("SELECT qwe,username_value,wer FROM my_table;") {
            Ok(mut stmt) => {
                match stmt.query_map([],|row| {Ok(row.get_unwrap::<usize,String>(1).clone())}) {
                    Ok(usernames) => {
                        for username in usernames {
                            if username.is_ok() {
                                println!("{}",username.expect("Could not read username value"));
                            }
                        }
                        println!("Query done");
                    },Err(err) => println!("Error {}",err),}
            },}
    },}

进入这个

match Connection::open(&db_path)
    .and_then(move |conn: Connection| conn.prepare("SELECT qwe,wer FROM my_table;"))
    .and_then(|mut stmt: Statement| stmt.query_map([],String>(1).clone())})) {
    Ok(usernames) => {
        for username in usernames {
            if username.is_ok() {
                println!("{}",username.expect("Could not read username value"));
            }
        }
        println!("Query done");
    },Err(_) => println!("Error querying db"),}

sql 库是 rusqlite

一个片段被编译器接受,第二个不是。 编译器用以下错误消息向我尖叫:

error[E0515]: cannot return value referencing function parameter `conn`
   --> src\main.rs:134:43
    |
134 |         .and_then(move |conn: Connection| conn.prepare("SELECT qwe,wer FROM my_table;"))
    |                                           ----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |                                           |
    |                                           returns a value referencing data owned by the current function
    |                                           `conn` is borrowed here

error[E0515]: cannot return value referencing function parameter `stmt`
   --> src\main.rs:135:41
    |
135 |         .and_then(|mut stmt: Statement| stmt.query_map([],String>(1).clone())})) {
    |                                         ----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |                                         |
    |                                         returns a value referencing data owned by the current function
    |                                         `stmt` is borrowed here

error: aborting due to 2 prevIoUs errors

我在三个闭包上尝试使用 move错误消息是相同的。 为什么第二个片段中的所有权是错误的,这是写这样的东西的惯用方式?

解决方法

问题是 conn.prepare 返回一个引用 conn 的语句,但是 conn 在闭包结束时被销毁,因此当语句尝试使用它时它不再存在.做你想做的惯用方法是使用 ? 运算符:

let conn = Connection::open(&db_path)?;
let mut stmt = conn.prepare("SELECT qwe,username_value,wer FROM my_table;")?;
for username in stmt.query_map([],|row| {Ok(row.get_unwrap::<usize,String>(1).clone())})? {
    if username.is_ok() {
        println!("{}",username.expect("Could not read username value"));
    }
}

并让调用者处理错误。如果你想自己处理错误,你可以将上面的代码包装在一个本地函数或闭包中(另见this question)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?