rwa*_*ace 5 debugging f# attributes
我正在寻找一种在 F# 中打印值以及源文件和行号的方法;它用于半交互式调试,因此语法需要简短。
https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/caller-information提供了部分解决方案。该页面上的代码可以这样调用:
Tracer().DoTrace "foo"
Run Code Online (Sandbox Code Playgroud)
我正在寻找
trace "foo"
Run Code Online (Sandbox Code Playgroud)
但是,当然,trace将上述内容包装在函数中将报告trace始终是调用者,这违背了目的。
我尝试过let inline trace ...,但这没有任何区别。
如果 F# 有这样的宏,我会尝试使用宏,但它没有。
通过修改上述链接代码或其他方式,trace以尽可能短的调用者语法获取功能的最佳方法是什么?
打开类型会公开该类型的所有可访问静态成员,因此我认为这可以满足您的需求:
open System.Runtime.CompilerServices
open System.Runtime.InteropServices
type Tracer() =
static member trace(message: string,
[<CallerMemberName; Optional; DefaultParameterValue("")>] memberName: string,
[<CallerFilePath; Optional; DefaultParameterValue("")>] path: string,
[<CallerLineNumber; Optional; DefaultParameterValue(0)>] line: int) =
printfn $"Message: {message}"
printfn $"Member name: {memberName}"
printfn $"Source file path: {path}"
printfn $"Source line number: {line}"
open type Tracer
[<EntryPoint>]
let main _ =
trace "foo"
0
Run Code Online (Sandbox Code Playgroud)
输出是:
Message: foo
Member name: main
Source file path: ...\Program.fs
Source line number: 18
Run Code Online (Sandbox Code Playgroud)
或者,如果需要,您可以自动打开该类型,因此调用者不必显式打开它:
Message: foo
Member name: main
Source file path: ...\Program.fs
Source line number: 18
Run Code Online (Sandbox Code Playgroud)