F#:[<structuredformatdisplay>]与覆盖__。ToString()。 ¿这是什么问题?

时间:2019-05-04 18:56:18

标签: f# attributes record tostring

上下文: 使用dotnet 2.2.203在容器化环境中运行F# 在Ubuntu 18.04台式机上

问题:组合记录中的StructuredFormatDisplay不起作用。 错了吗 这是代码

[<StructuredFormatDisplay("{SizeGb}GB")>]
type Disk = 
    { SizeGb : int }
    override __.ToString() = sprintf "<%dGB>" __.SizeGb

[<StructuredFormatDisplay("Computer #{Id}: {Manufacturer}/{DiskCount}:{Disks}")>]
type Computer =
    { Id: int
      mutable Manufacturer: string
      mutable Disks: Disk list }
      override __.ToString() = sprintf "#%d<%s>%O" __.Id __.Manufacturer __.Disks


[<EntryPoint>]
let main argv =

    let myPc =
        { Id = 0
          Manufacturer = "Computers Inc."
          Disks =
            [ { SizeGb = 100 }
              { SizeGb = 250 }
              { SizeGb = 500 } ] }

    printfn "%%O = %O" myPc 
    printfn "%%A = %A" myPc   
    0

和输出

%O = #0<Computers Inc.>[<100GB>; <250GB>; <500GB>]
%A = Computer #0: Computers Inc./3:[...GB; ...GB; ...GB]

计算机记录中磁盘记录的%A模式仅打印一些...点!

但是%O打印得很好。

1 个答案:

答案 0 :(得分:1)

我确认在我的上下文中也会发生此问题。

直接在磁盘列表上打印%A时,输出就可以了:

printfn "%A" [{SizeGb = 10}] // output: [10GB]

但是当磁盘代码按照您的代码间接打印时:

[<StructuredFormatDisplay("Computer #{Id}: {Manufacturer}/{DiskCount}:{Disks}")>]

我们收到了点。

我认为这是F#核心库的错误。一种解决方法是添加一个新的字符串属性,其中包含磁盘列表的格式化字符串,而改用该属性:

[<StructuredFormatDisplay("Computer #{Id}: {Manufacturer}/{DiskCount}:{DisksStr}")>]
type Computer =
{ Id: int
  mutable Manufacturer: string
  mutable Disks: Disk list }
  member this.DisksStr = sprintf "%A" this.Disks