【问题标题】:F# custom debug print operationF#自定义调试打印操作
【发布时间】:2014-05-28 21:56:30
【问题描述】:

我想构建一个自定义打印功能,我用它来确定要为调试记录器打印什么。

我正在寻找的功能是这样的:

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

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

【问题讨论】:

  • 这个问题似乎有一个答案,可以修改为你想要的stackoverflow.com/questions/5569909/…。但是,如果您希望您的函数能够使用 printf 所做的所有魔法,那将是困难的

标签: f# printf


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    我能想到的最好方法是在您想打印时将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
    

    【讨论】:

    • 我非常喜欢这两个答案,但下面的答案似乎更惯用。无论如何,真的非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多