Действительно ли это - структурированная printf ошибка F#?

Код:

printfn "%10s"  "abc"
printfn "%-10s" "abc"
printfn "%10d"   123
printfn "%-10d"  123
printfn "%10c"   'a'
printfn "%-10c"  'a'

Вывод:

       abc
abc
       123
123
a
a

Так выравнивание по правому краю %c не работает, как я ожидаю...

F# 2.0 build 4.0.30319.1

5
задан controlflow 23 May 2010 в 12:33
поделиться

2 ответа

Я не думаю, что тот факт, что он отсутствует в таблице допустимых типов, вызывает проблему (модификатор "%c" определенно поддерживается, потому что тип printfn "%c" - char -> unit, как и следовало ожидать). Так что, на мой взгляд, это действительно похоже на ошибку.

Простым обходным решением является использование модификатора "%O", который принимает любой тип (включая также значения char) и форматирует его с помощью метода ToString (доступного для всех . NET типов):

> printfn "%10O" 'a';;
         a
val it : unit

BTW: Я посмотрел исходный код библиотеки F# (из релиза CTP) и вот соответствующий бит из printf.fs (строка 478):

| 's',nobj::args -> 
  formatString outputChar info width (unbox nobj) false; i+1,args
| 'c',nobj::args -> 
  outputChar (unbox nobj); i+1,args // (1)
| 'b',nobj::args -> 
  formatString outputChar info width 
    (if (unbox nobj) then "true" else "false") false; i+1,args
| 'O',xobj::args -> 
  formatString outputChar info width 
    (match xobj with null -> "<null>" | _ -> xobj.ToString()) false; i+1,args

Строка (1) форматирует символ и игнорирует параметр width (который является шириной, которую вы указали). Так что, если только это (по какой-то причине, например, производительность?) не является запланированным поведением, это действительно похоже на ошибку!

Я полагаю, что следующая реализация исправит проблему (Брайан ;-)! Ты там?):

| 'c', nobj::args -> 
  formatString outputChar info width 
    (string ((unbox nobj):char)) false; i+1,args 
6
ответ дан 14 December 2019 в 01:02
поделиться

% c не указан в таблице допустимых типов для F # printf . Может, в этом причина твоей проблемы.

Как ни странно, согласно таблице вообще нет типа для печати одиночных символов.

3
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: