6

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;
            }
        };

私は基本的にそれが何をしているのか理解しています。データベース接続を取得しようとしており、エラーのテストも行っています。それがどのように行われているのか正確にはわかりません。

それをよりよく理解するために、ステートメントを除いて書き直したかったのmatchですが、それを行う知識がありません。それは可能ですか?sqlite::open()2 つの変数を返すか、それとも 1 つだけを返すか?

この例は、ステートメントなしでどのように別の方法で記述できmatchますか? それが必要だとか好ましいと言っているわけではありませんが、言語を学ぶのに役立つかもしれません。

4

4 に答える 4

8

外側のステートメントは、一致式の値を に代入する代入ですdatabase。一致式は の戻り値に依存しますsqlite::open。これはおそらく型(バリアントとResult<T, E>を持つ列挙型) です。の場合、enum バリアントには、一致式が分解してこの値を返すパラメーターがあります (したがって、変数 に割り当てられます)。の場合、enum バリアントにはエラー オブジェクトを含むパラメーターがあり、出力されて関数が戻ります。Ok(T)Err(E)OkdbdatabaseErr

match ステートメントを使用しない場合、これは次のように記述できます (match を使用しないことを明示的に要求したという理由だけで、ほとんどの人はこのコーディング スタイルが悪いと見なされます)。

let res = sqlite::open("test.db");
if res.is_err() {
    println!("Error opening test.db: {:?}", res.unwrap_err());
    return;
}
let database = res.unwrap();
于 2013-10-17T09:24:35.957 に答える