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