我在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)
printf相当于Console.Write,printfn等同于Console.WriteLine.您正在比较不相等的功能.
只需更换你printf的printfn,你的例子将按预期工作.
它为何不一起工作printf和Console.Write
这只是方式FSI功能:直到你的程序生成一个新行不打印文本的输出窗口.这有一个很好的动机:如果FSI立即打印出文本,它可能会通过自己的一些中间信息输出来破坏你的输出.
通话Console.Flush与此无关.当你的程序在FSI中运行时,你实际上没有直接访问控制台,它通过FSI自己的过滤器.FSI确实收到你的输入(即没有必要打电话Flush),它只是不立即打印出来(见上文).
如果您自己运行程序而不是FSI,那么您的输出将按预期呈现.