我在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()
如果我将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()
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()
答案 0 :(得分:7)
printf
相当于Console.Write
,而printfn
相当于Console.WriteLine
。您正在比较不相等的函数。
只需将printf
替换为printfn
,您的示例就会按预期运行。
为什么它不适用于printf
和Console.Write
这就是FSI的功能:在程序生成换行符之前,它不会将文本打印到输出窗口。这有一个很好的动机:如果FSI立即打印出文本,它可能会通过自己的一些中间信息输出来打破你的输出。
调用Console.Flush
与此无关。当你的程序在FSI中运行时,你实际上没有直接访问控制台,它通过FSI自己的过滤器。 FSI确实立即收到您的输入(即无需拨打Flush
),它不会立即打印出来(见上文)。
如果您自己运行程序而不是FSI,那么您的输出将按预期呈现。