这个Rust代码可以在没有"匹配"语句的情况下编写吗?

Bri*_* Oh 4 sqlite rust rust-0.8

linuxfood为sqlite3创建了绑定,我很感激.我刚刚开始学习Rust(0.8),我正在努力理解这段代码到底在做什么:

extern mod sqlite;

fn db() {

    let database =
        match sqlite::open("test.db") {
            Ok(db) => db,
            Err(e) => {
                println(fmt!("Error opening test.db: %?", e));
                return;
            }
        };
Run Code Online (Sandbox Code Playgroud)

我基本上了解它在做什么.它试图获取数据库连接并测试错误.我不明白它是如何做到的.

为了更好地理解它,我想在没有match声明的情况下重写它,但我没有这方面的知识.那可能吗?是否sqlite::open()返回两个变量,或只有一个?

如果没有match声明,这个例子如何以不同的方式写出来 我不是说这是必要或可取的,但它可以帮助我学习语言.

Zar*_*ony 8

outer语句是一个赋值,用于指定匹配表达式的值database.匹配表达依赖于的返回值sqlite::open,这可能是类型的Result<T, E>(具有变体枚举Ok(T)Err(E)).如果是这样的话Ok,枚举变量有一个参数,匹配表达式将其构造db并传回该值(因此它被赋值给变量database).如果是这样的话Err,枚举变体有一个带有错误对象的参数,该参数被打印并且函数返回.

如果不使用匹配语句,可以像下面那样编写(只是因为你明确要求不使用匹配 - 大多数人都会考虑这种糟糕的编码风格):

let res = sqlite::open("test.db");
if res.is_err() {
    println!("Error opening test.db: {:?}", res.unwrap_err());
    return;
}
let database = res.unwrap();
Run Code Online (Sandbox Code Playgroud)

  • 这段代码是我如何回答这个问题的.从这里可以看到[结构结构](https://github.com/mozilla/rust/blob/master/src/libstd/result.rs#L33)的定义,然后是[展开]( https://github.com/mozilla/rust/blob/master/src/libstd/result.rs#L108)方法.你可以看到`unwrap`使用`match`,而在一种情况下它会导致`失败!`.这是_why_这被认为是不好的风格:在运行时可能会出现故障."匹配"最好的原因是编译器确保您明确处理每个案例.(编辑:修复SO标记.) (3认同)

Dav*_*nds 5

我只是在学习Rust,但这是解决这个问题的另一种方法.

if let Ok(database) = sqlite::open("test.db") {
    // Handle success case
} else {
    // Handle error case
}
Run Code Online (Sandbox Code Playgroud)

请参阅有关的文档if let.