2017-01-17 5 views
0

を計算し、二つの数字を読み込み、その商を計算しようとしている:エラー閲覧&Iは、錆の初心者だ商

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半影に持っているということである:(あなたが同じスコープにNoneSomeを引っ張っていなかった::std::option::Option

  • よりも優先され、あなたがOptionを定義し

    • を彼ら::std::option::Option::{None, Some}結果であるプレリュード

    介しあるのに対し、)Option範囲にネストされていますOption::Optionを指し、NoneおよびSome::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

    この修正を試しても、コンパイルエラーは消えてしまいますが、代わりにランタイムエラーが発生します: 'thread '

    'は 'Expected i32''でパニックになり、商を印刷するよりも。 – wogsland

    0

    Optionを定義する必要はありません。それはalready part of the standard libraryです。定義を削除すると、そのエラーが発生します。次のエラーは、番号without parsing it firstとして使用しようとしているStringがあることです。

    私はを強くお勧めします。あなたは戻ってThe Rust Programming Languageを読んでください。最初の章、特に推測ゲームは、まさにこのレベルの紹介を対象としています。

    +0

    @wogsland私の答えを続けてください。最初の段落には** 3 **文しかなく、* 3番目の文にはエラーが記述されています。 – Shepmaster

    +0

    @wogslandこれはプロのプログラマーのためのサイトなので、対象読者が言語やフレームワークに関する入門書を読んで、より小さなコンポーネントから大きなソリューションを構成できることを願っています。さらに、私は**文字列の解析方法に関する既存の答え**にリンクしています。回答者があなたのコードのすべて*を書くことを好むでしょうか? – Shepmaster

    +1

    クイックメモ:*熱心な人やプロのプログラマーのためのサイト –

    関連する問題