F#:printf vs Console.WriteLine

时间:2016-06-12 17:43:39

标签: 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()

如果我将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()

1 个答案:

答案 0 :(得分:7)

printf相当于Console.Write,而printfn相当于Console.WriteLine。您正在比较不相等的函数。

只需将printf替换为printfn,您的示例就会按预期运行。

为什么它不适用于printfConsole.Write
这就是FSI的功能:在程序生成换行符之前,它不会将文本打印到输出窗口。这有一个很好的动机:如果FSI立即打印出文本,它可能会通过自己的一些中间信息输出来打破你的输出。

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

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