2016-06-12 220 views
5

我在f#交互式窗口中玩耍,發現printf沒有按預期工作。在下面的代碼片段中,ReadLine在第一次打印之前執行。如果我將printf更改爲Console.WriteLine,它將按預期工作。F#:printf vs Console.WriteLine

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是怎麼回事?有沒有flush電話我可以讓它在readline之前打印?是否有我應該使用的f#readline?

----------------- [編輯] --------------------

讀取後費奧多爾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'等效於'printfn',而不是'printf'。也許你的控制檯在接收到換行符之前不會呈現文本? –

+1

的確,@FyodorSoikin是正確的:如果將'printf'改爲'printfn','run'函數就像你期望的那樣工作。在任何情況下,您都可以省去「忽略」功能,並且不需要刷新控制檯。 –

+1

是的。我也證實了這一點。我也證實它與'Console.Write'和'Console.Writeline'一致。這隻會引發問題,爲什麼'Console.Write'不能按預期寫入輸出?我甚至沖洗了緩衝區。 –

回答

7

printf相當於Console.Write,和printfn相當於Console.WriteLine。你正在比較不等價的函數。

只需將printf替換爲printfn,您的示例將按預期工作。


爲何不與printfConsole.Write
工作,這僅僅是這樣的FSI功能:直到你的程序生成一個新行不打印文本的輸出窗口。這有一個很好的動機:如果FSI馬上打印出文本,它可能會用自己輸出的一些中間信息來破壞你的輸出。

調用Console.Flush與它無關。當您的程序在FSI中運行時,您實際上並不直接訪問控制檯,而是通過FSI自己的過濾器。 FSI確實會立即收到您的輸入(即無需撥打Flush),但它不會立即打印出來(請參閱上文)。

如果你自己運行你的程序,而不是FSI,那麼你的輸出將按照你的預期呈現。