F #: [<StructuredFormatDisplay>] против переопределения __. ToString (). ¿Что это не так? - PullRequest
1 голос
/ 04 мая 2019

Контекст: запуск F # в контейнерной среде с dotnet 2.2.203 на настольном компьютере Ubuntu 18.04

Вопрос: StructuredFormatDisplay в Composed Record не работает.Было ли это неправильно?Это код

[<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 Ответ

1 голос
/ 05 мая 2019

Я подтверждаю, что эта проблема также возникает в моем контексте.

Когда вы печатаете% 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...