2013-10-26 64 views
6

我正在學Rust,它看起來很有趣。我對「比賽」還不是很熟悉,但看起來相當完整。我使用下面的代碼(下面)將字符串轉換爲i64,其中包括註釋掉的行「None」而不是下一行「_」。我想知道如果沒有下劃線的情況下發生了什麼事情,或者「無」可能是一竅不通的。調用代碼需要積極的i64,所以消極的結果是無效的輸入(在這種情況下)。我不確定是否有可能在使用此示例的情況下指示返回錯誤,而不是使用結構。如果沒有匹配,使用「匹配」的Rust會發生什麼?

  1. 沒有下劃線作爲匹配項目,「無」會捕獲所有,並且可以使用它而不是下劃線嗎?

  2. 是否有可能在不使用結構作爲返回值的情況下返回此類函數中的錯誤?

  3. 一般情況下,使用「匹配」是否可能出現不匹配,如果是,會發生什麼?

  4. 在下面的例子中,使用下劃線和使用「無」之間是否有區別?

示例代碼:

fn fParseI64(sVal: &str) -> i64 { 
    match from_str::<i64>(sVal) { 
     Some(iVal) => iVal, 
//  None => -1 
    _ => -1  
    } 
} 

回答

8
  1. 沒有下劃線作爲一個匹配的項目,將 「無」 捕獲所有,並可以將其用來代替下劃線?

在這種情況下,是的。 Option<T>只有2種情況:Some<T>None。 您已經匹配所有值的Some個案,None是唯一剩下的案例,因此 None的行爲與_的行爲完全相同。

  2.是否可以在不使用結構體作爲返回值的情況下返回類似這樣的函數中的錯誤?

我建議你閱讀這篇詳細的指南,瞭解所有可能的方式來處理錯誤 - http://static.rust-lang.org/doc/master/tutorial-conditions.html

使用選項和結果會要求你返回一個結構。

  3.一般情況下,使用「匹配」是否可能出現不匹配,如果是,會發生什麼?

如果Rust無法保證處理所有可能的情況,Rust將不編譯match。如果您不符合所有可能性,則需要有_條款。

  4.在下面的例子中,使用下劃線和使用「無」之間是否有區別?

否參見答案#1。

以下是你可以寫你的函數的許多方法3:

// Returns -1 on wrong input. 
fn alt_1(s: &str) -> i64 { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     i 
    } else { 
     -1 
    }, 
    None => -1 
    } 
} 

// Returns None on invalid input. 
fn alt_2(s: &str) -> Option<i64> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Some(i) 
    } else { 
     None 
    }, 
    None => None 
    } 
} 

// Returns a nice message describing the problem with the input, if any. 
fn alt_3(s: &str) -> Result<i64, ~str> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Ok(i) 
    } else { 
     Err(~"It's less than 0!") 
    }, 
    None => Err(~"It's not even a valid integer!") 
    } 
} 

fn main() { 
    println!("{:?}", alt_1("123")); 
    println!("{:?}", alt_1("-123")); 
    println!("{:?}", alt_1("abc")); 

    println!("{:?}", alt_2("123")); 
    println!("{:?}", alt_2("-123")); 
    println!("{:?}", alt_2("abc")); 

    println!("{:?}", alt_3("123")); 
    println!("{:?}", alt_3("-123")); 
    println!("{:?}", alt_3("abc")); 
} 

輸出:

123i64 
-1i64 
-1i64 
Some(123i64) 
None 
None 
Ok(123i64) 
Err(~"It's less than 0!") 
Err(~"It's not even a valid integer!") 
+0

謝謝,這看起來非常的說明。我會嘗試給出的例子。 –

相關問題