Новые строки и форматеры - PullRequest
5 голосов
/ 23 февраля 2011

Я недавно немного успокоился, когда стал самодовольным писать такие вещи, как

printf "\n%f\n" 3.2

вместо

printf "%s%f%s" Environment.NewLine 3.2 Environment.NewLine

Мой вопрос: есть ли способ написать безопасную вторую версию так же красиво, как и первую (т. Е. Специальный символ в строке формата, который вставляет Environment.Newline, так что аргумент для каждого экземпляра новой строки в строке формата isn ' т требуется)?

Ответы [ 2 ]

8 голосов
/ 23 февраля 2011

Как насчет использования kprintf для двойного прохода, заменив \ n на NewLine:

let nprintf fmt = Printf.kprintf (fun s -> s.Replace("\n", Environment.NewLine) |> printf "%s") fmt

Затем в nprintf "\n%f\n" 3.2 все \ n заменяются на NewLine.

5 голосов
/ 23 февраля 2011

Не существует escape-последовательности, но вы могли бы ее сократить:

[<AutoOpen>]
module StringFormatting =
    let nl = System.Environment.NewLine

//Usage
printfn "%s%f%s" nl 3.2 nl

Здесь - это список символов на MSDN.

Интересно, что это будет делать:

printfn @"
%f
" 3.2
...