F#:printf 与 Console.WriteLine

F#: printf vs Console.WriteLine

我正在使用 f# interactive window 并发现 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()

printf等同于Console.Writeprintfn等同于Console.WriteLine。您正在比较不等效的函数。

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


为什么它不适用于 printfConsole.Write

这就是 FSI 的工作方式:它不会将文本打印到输出 window 直到您的程序生成换行符。它有一个很好的动机:如果 FSI 立即打印出文本,它可能会用它自己的一些中间信息输出来破坏你的输出。

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

如果您 运行 您的程序本身,而不是在 FSI 中,那么您的输出将按您预期的方式呈现。