F#自定义调试打印操作

时间:2014-05-27 07:11:09

标签: f# printf

我想构建一个自定义打印功能,用于确定调试记录器的打印内容。

我正在寻找的功能如下:

let debugLog severity ... = 
   if severity < logLevel then
       printfn ...
   // otherwise just ignore

不幸的是我不知道如何填写...我还想避免直接传递一个字符串作为第二个参数,我真的希望我的函数表现得像一个扩展的printfn。

2 个答案:

答案 0 :(得分:2)

您可以使用kprintf功能。

let maxLevel = 3

let log severityLevel str = 
    if severityLevel < maxLevel then
        printfn "%s" str
        // or you can add more formatting
        // printfn "Level: %i -> %s" severityLevel str

let logf sevLevel str = Printf.kprintf (log sevLevel) str

logf 1 "Message: %i" 1 // prints 'Message: 1'
logf 4 "Message: %i" 2 // doesn't print
logf 2 "Message: %s %i" "this is test" 3 // prints Message: this is test 3

答案 1 :(得分:1)

我能想到的最佳方式是在您想要打印时将fprintfstdout一起使用,在不打印时使用TextWriter.Null

let logLevel = 3

let debugLog severity format =
    let out =
        if severity < logLevel then
            stdout
        else
            System.IO.TextWriter.Null
    fprintfn out format

debugLog 2 "test: %i" 42 // prints 'test: 42'
debugLog 4 "test: %i" 42 // prints nothing