F#3:文本格式

使用任何语言时,您很可能需要设置文本格式,并且F#没什么不同。

由于F#是.NET语言,因此我们始终可以使用Console.WriteLine(..)和String.Format(..),在这里我们可以使用您在常规.NET代码中使用的任何常见格式化程序。

但是,F#还支持更类似于语法的C方法,该方法在Core.Printf模块中可用。 可以使用其中的一个函数代替使用Console.WriteLine(..).NET类。

应该用于写入标准输出的等效F#函数是printfn,这实际上是在F#中使用文本格式时的首选方法。

为什么printfn比Console.WriteLine(..)更可取?


首选printfn有几个原因;下面列出了一些主要原因:

  • 静态类型检查。 这意味着,如果我们在期望字符串的地方传递int值,则会对此发出警告
  • 由于printfn是本机F#函数,因此它的作用与其他任何F#函数一样。

考虑以下代码片段

//   printfn "should be a decimal value %d" "cat" // printfn "should be a decimal value %d" 42 //  ,   Console.WriteLine("should be a decimal value {0}" , "cat") //     printfn "this only expected 1 arg of type decimal %d" 42 "dog" //    ,   Console.WriteLine("this only expected 1 arg of type decimal {0}" , 42, "dog") // ,   printfn "this only expected 2 args of type decimal %d and string %s" 42 "dog" 

现在,如果我们在Visual Studio IDE中查看此代码的屏幕截图,我们确实会看到预期失败的行清楚地显示为错误:

图片

如何使用printfn?


也许最好先查看一些可用于值的标准格式化程序。 下面的MSDN表显示了可供您使用的标准运算符: msdn.microsoft.com/zh-cn/library/ee370560.aspx

那么,如何在标准之外创建出色的格式呢?


因此,现在我们看到了如何将格式化的输出写入标准输出(printfn这样做了),但是如果我们想在其他地方使用格式化的行怎么办? 如果我们想将字符串值与使用上述某些格式化工具构造的格式精美的字符串相关联,或者甚至想写入StringBuilder或TextWriter,该怎么办?

是的,实际上,您会在Core.Printf模块中找到许多其他有用的功能。 撰写本文时的完整列表如下:

清单
bprintf打印到StringBuilder。
eprintf将格式化的输出打印到stderr。
eprintfn通过添加新行将格式化的输出打印到stderr。
failwithf打印到字符串缓冲区,并使用给定的结果引发异常。 辅助打印机必须返回字符串。
fprintf打印到文本编写器。
fprintfn通过添加新行来打印到文本编写器。
kbprintfbprintf相似,但是它调用指定的函数来生成结果。 请参阅kprintf。
kfprintf与fprintf相似,但是它调用指定的函数来生成结果。 请参阅kprintf。
kprintf与printf类似,但是调用指定的函数来生成结果。 例如,它们允许在所有输出都输入到通道之后而不是之前强制重置打印。
kspintf与sprintf类似,但是调用指定的函数来生成结果。 请参阅kprintf。
printf将格式化的输出打印到标准输出。
printfn通过添加新行,将格式化的输出打印为标准输出。
sprintf使用内部字符串缓冲区打印到字符串,然后将结果作为字符串返回。 辅助打印机必须返回字符串。

我不会经历所有这一切,但我将考虑最常见的情况:

bprintf


打印到StringBuilder。

 let builder = new StringBuilder(524288) Printf.bprintf builder "This will be a string line : %s\r\n" "cat" Printf.bprintf builder "This will be a bool line : %b\r\n" true Printf.bprintf builder "This will be a int line : %u\r\n" 42 Printf.bprintf builder "This will be a hex line : %X\r\n" 255 printfn "%s" (builder.ToString()) 

这将在F#控制台应用程序中提供此输出

fprintf


在文本编写器中打印。

 use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close() 

这将导致文件在临时创建

图片

冲刺


 let result = Printf.sprintf "This will return a formatted string : %s\r\n" "cat" printfn "%s" result 

图片

Source: https://habr.com/ru/post/zh-CN470037/


All Articles