linuxfood has created bindings for sqlite3,對此我很感激。我剛開始學習拉斯特(0.8),和我想要了解什麼的這段代碼是這樣做的:這個Rust代碼可以在沒有「匹配」語句的情況下編寫嗎?
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()
是否返回兩個變量,或者只有一個?
如果沒有match
聲明,此示例的寫法有何不同?我並不是說這是必要的或者可取的,但它可以幫助我學習這門語言。
此代碼是我將如何回答這個問題。從這裏可以看到[Result struct]的定義(https://github.com/mozilla/rust/blob/master/src/libstd/result.rs#L33),然後[unwrap]( https://github.com/mozilla/rust/blob/master/src/libstd/result.rs#L108)方法。你可以看到'unwrap'使用'match',並且在一種情況下會導致'fail!'。這是_why_這被認爲是不好的風格:在運行時有潛在的失敗。 'match'的原因是編譯器確保你明確地處理每一個案例。 (編輯:修復SO標記。) – nejucomo
感謝您的帖子。我不得不做下面的小改動來完成這個工作「println(fmt!(」Error open test.db:%?「,res));」。雖然我通常不會這樣編寫代碼,但它確實可以讓我更好地理解發生的事情。 –
我不想聽起來迂腐,但「結果」實際上是一個枚舉,而不是一個結構。 ;)但是你說得對,Rust在Rust裏很棒。一方面它確保你不會意外地忘記處理一個案件,因爲匹配結構必須是詳盡的。另一方面,它提供解構來輕鬆訪問數據結構的內部組件。一個人通常不想避免但鼓勵使用'match'。 – Zargony