F#不';不适用于包含其他类型的类型
我有一个类型“Team”,其中包含另一个类型“Employee”。我已重写类型“Employee”的ToString()。但是,当我为类型“Team”执行ToString()时,“Employee”中的详细信息与标准的ToString()实现一起打印出来,我的重写逻辑从未使用过。有人能帮助理解为什么超控无效吗?代码如下:F#不';不适用于包含其他类型的类型,f#,F#,我有一个类型“Team”,其中包含另一个类型“Employee”。我已重写类型“Employee”的ToString()。但是,当我为类型“Team”执行ToString()时,“Employee”中的详细信息与标准的ToString()实现一起打印出来,我的重写逻辑从未使用过。有人能帮助理解为什么超控无效吗?代码如下: type Employee = { name : string address : string } override
type Employee =
{
name : string
address : string
}
override this.ToString() = sprintf "Hello %s" this.name
type Team =
{
employee1 : Employee
}
with member this.ToTightString =
this.ToString().Replace(" ","")
let employee = { name="Bob"; address="Unknown"; }
let team = {employee1=employee}
printfn "%s" (employee.ToString()) // Override works!
// OUTPUT: Hello Bob
printfn "--------------------"
printf "%s" team.ToTightString // Override doesn't work
// OUTPUT: {employee1={name="Bob";address="Unknown";};}
如上所述,StructuredFormatDisplay中指定的类型(例如type1)的文本表示形式将保留,即使对包含“type1”类型的类型调用ToString()。下面是一个例子:
open System.Text.RegularExpressions
[<StructuredFormatDisplay("name=Always Harry address={address}")>]
type Employee =
{
name : string
address : string
}
type AddressContainer =
{
employee: Employee
containerName: string
}
let address1 = { name="Bob"; address="Random City" }
let addressContainer1 = { employee=address1; containerName= "container1"}
printf "%s" (address1.ToString()) // prints "name=Always Harry address=Random City"
printf "%s" (addressContainer1.ToString()) // prints {employee = name=Always Harry address=Random City; containerName = "container1";}
open System.Text.regular表达式
[]
类型员工=
{
名称:string
地址:string
}
类型AddressContainer=
{
雇员:雇员
容器名称:字符串
}
让address1={name=“Bob”;address=“Random City”}
让addressContainer1={employee=address1;containerName=“container1”}
printf“%s”(address1.ToString())//打印“name=始终Harry address=随机城市”
printf“%s”(addressContainer1.ToString())//打印{employee=name=Always Harry address=Random City;containerName=“container1”}
您从未对员工调用覆盖。试试this.employe1.ToString().Replace(“,”)
。是的,这很有效。这是否意味着当且仅当我使用ToString()方法显式调用它时,重写才会起作用?因为我尝试执行printf“%A”employee,而ToString()也没有被覆盖,只是打印得很漂亮@简单的答案是肯定的。这是因为记录类型的默认ToString实现调用了sprintf
,它具有输出记录类型的特殊逻辑。出现这种情况的部分原因是现在没有时间给出完整的答案,但请看,它允许您为sprintf“%a”myInstance
指定自定义表示形式。这可能是你要找的东西的一部分。顺便说一句,这似乎对你也有用,不过请注意,这个问题是2012年提出的。是的,它很有效。谢谢我将创建一个示例并将其作为答案发布。谢谢!我以为这个属性只在FSI中起作用,但在我的程序中也起作用。重写ToString的意义是什么?是否存在ToString允许的属性无法执行的操作?