F# 如何使用printf自定义自定义类型的输出?
我已经阅读了大量的专家F#,正在构建一个实际的应用程序。在调试过程中,我已经习惯于像这样传递fsi命令,以使repl窗口中的内容清晰可见:F# 如何使用printf自定义自定义类型的输出?,f#,printf,string-formatting,f#-interactive,F#,Printf,String Formatting,F# Interactive,我已经阅读了大量的专家F#,正在构建一个实际的应用程序。在调试过程中,我已经习惯于像这样传递fsi命令,以使repl窗口中的内容清晰可见: fsi.AddPrinter(fun (x : myType) -> myType.ToString()) 我想将其扩展到使用printf格式化程序,这样我就可以键入 printf "%A" instanceOfMyType 和控制自定义类型的输出。这本书暗示这是可以做到的(第93页,“通用结构格式可以扩展到任何用户定义的数据类型, 这是F#网站
fsi.AddPrinter(fun (x : myType) -> myType.ToString())
我想将其扩展到使用printf格式化程序,这样我就可以键入
printf "%A" instanceOfMyType
和控制自定义类型的输出。这本书暗示这是可以做到的(第93页,“通用结构格式可以扩展到任何用户定义的数据类型,
这是F#网站上的一个主题),但我没有找到任何关于如何真正做到这一点的参考资料。有人知道怎么做吗?有可能吗
编辑:
我应该包括一个代码示例,它是我正在处理的记录类型,例如
type myType =
{a: int}
override m.ToString() = "hello"
let t = {a=5}
printfn "%A" t
printfn "%A" (box t)
两种打印语句都产生:
{a = 5;}
嗯。。。我隐约记得这方面的一些变化,但我忘了它们是在CTP(1.9.6.2)之前还是之后发生的 无论如何,在CTP上,我看到了
type MyType() =
override this.ToString() = "hi"
let x = new MyType()
let xs = Array.create 25 x
printfn "%A" x
printfn "%A" xs
当在VFSI窗口中进行计算时,会执行我想要的操作,并且
x;;
xs;;
也打印得很好。因此,我想我不清楚这与期望的有什么不同?如果您重写ToString方法,应该这样做。在F#2.0中这样做的正确方法似乎是使用属性,例如:
[<StructuredFormatDisplay("hello {a}")>]
type myType = {a: int}
顺便说一下,如果您调用
printfn“%O”
而不是printfn“%A”
,则将始终使用ToString()
(即使对于记录和联合类型),谢谢;请参阅我对原始帖子的编辑,这是一种添加了成员函数的记录类型,其行为与类类型不同…@Brian,是的,应该可以,但正如flatline所说,它不适用于联合和记录类型。不久前我遇到了这个问题:(不记得我在没有得到任何后续信息的情况下是否向fsbugs发送了一些东西,对不起)另请参见,顺便说一句,感谢@Brian在其回答的后续评论中发布了这些链接。我只是觉得其他任何人都值得一试。属性/成员可以是private
,以避免暴露可能分配对象属性的对象(而不是方法调用)。此外,我无法使用对象方法(“未找到”)。
[<StructuredFormatDisplay("{AsString}")>]
type myType =
{a: int}
override m.ToString() = "hello"
member m.AsString = m.ToString() // a property that calls a method