2016-05-26 5 views
1

私は、ユーザー入力が関数内で収集され、値が返されるプログラムを持っています。この関数では、Stringの入力をu32に解析しようとします。パニックではなく失敗した場合は、Stringを返信してください。成功した場合にユーザー指定の型を返し、失敗した場合にStringを返すにはどうすればよいですか?

戻り値の型を許可することはできますか?私はRust Bookのジェネリックスのセクションを読んだが、ジェネリック型を返すことについては何も書いていなかった。ここで

は私のコードです:

fn read_input(question: &str) -> u32 { 
    let mut input = String::new(); 
    println!("{}", question); 
    io::stdin() 
     .read_line(&mut input) 
     .ok() 
     .expect("failed to read input"); 
    match input.trim().parse() { 
     Ok(number) => { 
      return number; // return a u32 
     } 
     Err(_) => { 
      return input; // return a String 
     } 
    } 
} 

答えて

5

を参照してください。あなたがここに二つの異なる質問をしているようです。

1.ユーザーはどのように機能の出力タイプを指定できますか?

汎用パラメータを使用します。たとえば、Iterator::collectには戻り値の型として使用される型パラメータBが必要です。

2. 2つの異なるタイプの値を返すにはどうすればよいですか?あなたは二つのタイプの「労働組合」となるenumを作成することができます

pub enum Union<A, B> { 
    ValueA(A), 
    ValueB(B) 
} 

この場合、ValueAまたはValueB場合には本質的な意味はありません。

enumはこれと似ていますが、それぞれの場合に意味が追加されます。つまり、Okは成功を示し、Errはエラーを示します。

私はあなたが Resultを使用すると、エラーケースが parseエラーで読み取り入力を返すことが示唆さ、言っ

use std::io; 
use std::str::FromStr; 

// 1: T is a type parameter that is used as (part of) return type 
// 
// 2: Result allows you to return either the parsed T value or 
// the read input value with the parse error 
fn read_input<T: FromStr>(question: &str) -> Result<T, (String, T::Err)> { 
    let mut input = String::new(); 
    println!("{}", question); 
    io::stdin() 
     .read_line(&mut input) 
     .ok() 
     .expect("failed to read input"); 
    match input.trim().parse() { 
     Ok(p) => Ok(p), 
     Err(err) => Err((input, err)) 
    } 
} 

これは、ユーザーに素敵なエラーメッセージを書くことができます:

fn main() { 
    // you can use any type that implements FromStr instead of u32 
    match read_input::<u32>("2 + 2?") { 
     Ok(ans) => println!("answer: {}", ans), 
     Err((input, err)) => println!("\"{}\" is an invalid answer: {}", input, err) 
    } 
} 
+0

ありがとうございました。これは私の質問に完全に答えました。 – qolop

0

この特定の機能のために行う事がinput.trim().parse()ラインからResultを返しているように私には思えます。あなたはparse-ablesee docs

fn read_input<F>(question: &str) -> Result<F, F::Err> 
    where F : FromStr 
    { 
    let mut input = String::new(); 
    println!("{}", question); 
    io::stdin() 
     .read_line(&mut input) 
     .expect("failed to read input"); 
    input.trim().parse() 
} 

あるものから、結果を返すように言うようにする方法も一般的な行うことができplaygroundgist

+0

'ok()。expect()'が悪いときは、Result :: Err'の情報を捨てます。 '.read_line()。expect()'を使ってください。 – delnan

+0

ありがとうございました。 – user25064

関連する問題