F#:printf vs Console.WriteLine

Phi*_*ens 5 f# f#-interactive

我在f#交互式窗口中玩游戏,发现printf没有像我预期的那样工作.在下面的代码片段中,ReadLine在第一个printf之前执行

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

run()
Run Code Online (Sandbox Code Playgroud)

如果我将printf更改为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()
Run Code Online (Sandbox Code Playgroud)

printf发生了什么?是否有flush电话我可以在readline之前打印它?我应该使用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()
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 7

printf相当于Console.Write,printfn等同于Console.WriteLine.您正在比较不相等的功能.

只需更换你printfprintfn,你的例子将按预期工作.


它为何不一起工作printfConsole.Write
这只是方式FSI功能:直到你的程序生成一个新行不打印文本的输出窗口.这有一个很好的动机:如果FSI立即打印出文本,它可能会通过自己的一些中间信息输出来破坏你的输出.

通话Console.Flush与此无关.当你的程序在FSI中运行时,你实际上没有直接访问控制台,它通过FSI自己的过滤器.FSI确实收到你的输入(即没有必要打电话Flush),它只是不立即打印出来(见上文).

如果您自己运行程序而不是FSI,那么您的输出将按预期呈现.