2017-01-17 41 views
0

我是一個新手鏽,並試圖在兩個數字閱讀和計算它們的商:錯誤讀取及計算商數

use std::io; 

enum Option<T> { 
    None, 
    Some(T), 
} 

fn safe_div(n: i32, d: i32) -> Option<i32> { 
    if d == 0 { 
     return None; 
    } 
    return Some(n/d); 
} 

fn main() { 
    println!("Please input your numerator."); 
    let mut numerator = String::new(); 
    io::stdin() 
     .read_line(&mut numerator) 
     .expect("Failed to read line"); 
    println!("Please input your denominator."); 
    let mut denominator = String::new(); 
    io::stdin() 
     .read_line(&mut denominator) 
     .expect("Failed to read line"); 
    match safe_div(numerator, denominator) { 
     None => println!("Can't divide by zero!"), 
     Some(v) => println!("Quotient is {}", v), 
    } 
} 

,但我收到以下錯誤反覆幾次,當我嘗試編譯:

src/safe_div.rs:12:12: 12:21 error: mismatched types: expected Option<i32> , found std::option::Option<i32> (expected enum Option , found enum std::option::Option) [E0308]

我在這裏錯過了什麼?

回答

6

默認情況下,任何Rust應用程序包括前奏。您可以關閉它,但如果不這樣做,它會將::std::option::Option<T>類型以及其變體NoneSome納入範圍。

除非有人決定使用這些名稱創建一些東西,在這種情況下,新定義的項目會佔據優先位置。

你這裏的問題是,你只有半陰影標準Option

  • 你定義Option,其優先級高於::std::option::Option
  • 你沒拉NoneSome到同一範圍(他們嵌套在Option範圍內),而::std::option::Option::{None, Some}是通過前奏

結果是Option是指::Option,而NoneSome分別是指::std::option::Option::None::std::option::Option::Some。一團糟。

一個解決方案,如果你真的想覆蓋,是導入NoneSome自己:

enum Option<T> { 
    None, 
    Some(T) 
} 

use Option::{None, Some}; 

另一種是不重新定義Option

一旦您應用了任一修復,您將意識到您將字符串作爲參數傳遞給safe_div,您可以使用.parse().expect("Expected i32")將它們解析爲整數。

+0

我試過這個修復和編譯錯誤消失,但它給我的運行時錯誤,而不是:'線程'

'恐慌在'預期i32''和死而寧比打印商。 – wogsland

0

不需要定義Option;這是already part of the standard library。刪除定義,它將會超過該錯誤。接下來的錯誤是您有一個String,您試圖使用without parsing it first號碼。

我會強烈建議你回去再讀The Rust Programming Language。第一章,特別是猜謎遊戲,正是針對這一級別的介紹。

+0

@wogsland請繼續閱讀我的答案。在第一段中只有** 3個句子,而第三個句子*描述了這個錯誤。 – Shepmaster

+0

@wogsland由於這是專業程序員的網站,我希望目標受衆能夠閱讀某種語言或框架的入門文檔,並能夠從較小的組件中編寫出更大的解決方案。此外,我**鏈接到現有的答案**如何解析字符串;你是否希望回答者爲你編寫所有代碼? – Shepmaster

+1

快速提示:*發燒友*和專業程序員的網站;) –