2016-01-25 14 views
5

私はいくつかの基本的な入出力の問題にいくつかの問題があります。具体的には、テキスト「あなたの名前を入力してくださいは、」私は私の名前を入力後の出力に書き込まれ、をヒットさを入力します。印刷前にこれを読み取るのはなぜですか?

Compiling chat v0.1.0 (file:///home/marcus/dev/rust/chat) 
    Running `target/debug/chat` 
marcus 
Please enter your name: 
Hello, marcus! 

use std::io; 

fn main() { 
    print!("Please enter your name: "); 

    let mut name = String::new(); 
    match io::stdin().read_line(&mut name) { 
     Ok(_) => println!(""), 
     Err(err) => println!("Could not parse input: {}", err) 
    } 

    println!("Hello, {}!", name.trim()); 
} 

は、次のような出力を提供します最初の "marcus"が私によって入力されました。入力を待つ前に、「名前を入力してください」と表示されないのはなぜですか?


それはOkResultで返された場合は、「何もしない」ことは可能ですか?この例では、Ok()は変数名に入力を保存したことを意味します。それは素晴らしいことです。しかし、この場合はOk() =>で何をすればよいですか?

答えて

7

なぜプログラムの印刷は、入力待ちの前に、「あなたの名前を入力してください」ではないでしょうか?

まあ、それはをしました。パフォーマンス上の理由から、標準出力はバッファされているだけです。書き込みは完了しましたが、メモリに書き込むだけでした。実際にユーザーに表示したい場合は、フラッシュをトリガーする必要があります。これは、改行を書き込むことによって、または明示的にそれをすることのいずれかによって行うことができます。

io::Write::flush(&mut io::stdout()).expect("flush failed!"); 

// If you "use" `io::Write`... 
io::stdout().flush().expect("flush failed!"); 

また、それが返される結果がOKであれば、「何もしない」ことは可能ですか?

確かに。ただ...何もしないでください。

​​

ここでは関係の要件は、match内のすべての武器が同じ結果型を持っている必要があるということです。println!の場合は、()となります。さておき、空のブロック(または()を返す別の関数)から、あなただけのリテラルを使用することができます)

match io::stdin().read_line(&mut name) { 
    Ok(_) =>(), 
    Err(err) => println!("Could not parse input: {}", err) 
} 
+1

でそれを見つけることができないよう、 '聞かせた場合のErr(ERR)= IO :: STDIN()READ_LINE(&MUT名){printlnの( "入力を解析できませんでした:{}"。!、エラー); } '。 – Veedrac

11

これはprint!についてdocumentationで説明されています。 print!は改行を出力せず、stdoutはラインバッファーであるため、出力は表示されません。 @Veedracが自分の中で指摘したように

use std::io::{self, Write}; 

fn main() { 
    print!("Please enter your name: "); 
    io::stdout().flush(); 

    let mut name = String::new(); 
    match io::stdin().read_line(&mut name) { 
     Ok(_) =>(), 
     Err(err) => println!("Could not parse input: {}", err) 
    } 

    println!("Hello, {}!", name.trim()); 
} 

:あなたの2番目の質問については

use std::io::{self, Write}; 

print!("Please enter your name: "); 
io::stdout().flush(); 

あなたは常に明示的に単位を返すことができます:あなたは、手動でフラッシュstdoutができ

Ok(_) =>(), 

だからあなたのプログラムになります(今削除された)コメントmatchの代わりにif let expressionを使用すると、read_lineの結果:

if let Err(err) = io::stdin().read_line(&mut name) { 
    println!("Could not parse input: {}", err) 
} 
+0

ああ、私は実際にそれをしようとしたが、それは '.flushを(認識していなかったので、いくつかのエラーを得ました'関数。私は最後の部分 'use std :: io :: {self、Write};'を見逃してしまった。 '{self、Write} 'が何を意味するのか気にしますか?私はあなたが言及おそらくすべきドキュメント – mnordber

関連する問題