2016-06-12 11 views
5

私はf#対話型ウィンドウで遊んでいて、printfが期待どおりに動作しないことを発見しました。私は期待どおりに動作しますConsole.WriteLineをするのprintfを変更する場合は、次のスニペットでは、ReadLineメソッドは、最初のprintfF#:printf vs Console.WriteLine

let run() = 
    printf "What is your name?" 
    Console.Out.Flush() 
    let value = System.Console.ReadLine() 
    printf "Hello, %s, nice to meet you!" value 

run() 

前に実行されます。

let run() = 
    Console.Out.WriteLine "What is your name?" 
    Console.Out.Flush() 
    let value = System.Console.ReadLine() 
    printf "Hello, %s, nice to meet you!" value 

run() 

printfでは何が起こっていますか? readlineの前に印刷することができるflushコールはありますか?私が使用するはずのf#readlineはありますか?

----------------- [編集] --------------------

読んだ後Fyodor Soikinの答え、私は検証するために以下を試みた。確かに、スクリーンに印刷されたものはHelloであり、何らかの入力をした後にはWorldと表示されました。

open System 
let run() = 
    printf "Hello\n World" 
    let value = System.Console.ReadLine() 
    let msg = sprintf "Hello, %s, nice to meet you!" value 
    printf "%s" msg 
run() 
+3

'WriteLine'は' printf'ではなく 'printfn'に相当します。おそらくあなたのコンソールは、改行が受信されるまでテキストをレンダリングしないでしょうか? –

+1

実際、@FyodorSoikinは正しいです: 'printf'を' printfn'に変更した場合、 'run'関数は期待通りに機能します。いずれにしても、 'ignore'関数を省略することができ、コンソールをフラッシュする必要はありません。 –

+1

はい。私もこれを確認しました。また、 'Console.Write'対' Console.Writeline'と一貫していることも確認しました。これは疑問を提起するだけですが、 'Console.Write'が出力に期待どおりに書き込まないのはなぜですか?私はバッファーを洗い流した。 –

答えて

7

printfConsole.Writeに相当し、printfnConsole.WriteLineと等価です。同等でない関数を比較しています。

printfprintfnに置き換えると、ご使用の例が正常に動作します。


なぜそれがこれは単にFSI機能の方法ですprintfConsole.Write
では動作しません:あなたのプログラムは、改行を生成するまでには、出力ウィンドウにテキストを印刷しません。それにはやや良い動機があります.FSIがすぐに文章を印刷すると、中間情報を独自の出力で出力する可能性があります。

Console.Flushと呼ぶことは関係ありません。プログラムがFSIで実行されているときに、実際にコンソールに直接アクセスすることはなく、FSIの独自のフィルタを経由します。 FSIはすぐにあなたの入力を受け取ります(つまり、Flushに電話する必要はありません)、すぐにそれを印刷しません(上記参照)。

FSIではなくプログラムを単独で実行すると、期待どおりに出力がレンダリングされます。

関連する問題