如何在 F# 中覆盖复合类型中的 ToString?
Posted
技术标签:
【中文标题】如何在 F# 中覆盖复合类型中的 ToString?【英文标题】:How do I Override ToString in a Composite Type in F#? 【发布时间】:2014-12-08 15:51:41 【问题描述】:我正在学习如何在 F# 中创建复合*类型,但遇到了一个问题。我有这种类型和一个 ToString 覆盖。
type MyType =
| Bool of bool
| Int of int
| Str of string
with override this.ToString() =
match this with
| Bool -> if this then "I'm True" else "I'm False"
| Int -> base.ToString()
| Str -> this
let c = Bool(false)
printfn "%A" c
我在 ToString 覆盖中收到一个错误,提示“此构造函数应用于 0 个参数,但需要 1 个”。我很确定这段代码不会编译,但它显示了我正在尝试做的事情。当我注释掉覆盖并运行代码时,c
打印为“val c : MyType = Bool false”。当我进入该代码时,我看到 c 有一个属性 Item
设置为布尔值 false
。但是,我似乎无法在代码中访问此属性。即使我注释c
也不会。
在这种情况下我应该如何覆盖 ToString?
* 我很确定这些被称为复合类型。
【问题讨论】:
【参考方案1】:当您使用Discriminated Union (DU)(这是该类型的适当名称)时,您需要像这样解压缩匹配语句中的值:
type MyType =
| Bool of bool
| Int of int
| Str of string
with override this.ToString() =
match this with
| Bool(b) -> if b then "I'm True" else "I'm False"
| Int(i) -> i.ToString()
| Str(s) -> s
let c = Bool(false)
printfn "%A" c
您看到的Item
属性是一个实现细节,不能从F# 代码访问。仅仅使用this
是行不通的,因为DU 是值的包装器,所以this
指的是包装器,而不是包含的值。
【讨论】:
以上是关于如何在 F# 中覆盖复合类型中的 ToString?的主要内容,如果未能解决你的问题,请参考以下文章
intellij idea中怎么覆盖tostring(),hashcode(),equals()?
在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?