Использование %a
позволяет печатать непосредственно на выходном канале, в отличие от "% s" и строкового значения, которое вы хотите напечатать, а затем распечатать его.
Различие, по-видимому, целиком в эффективности - зачем выделять потенциально большую строку (или использовать буфер с экспоненциальным изменением размера и копированием), когда возможно и целесообразно отправить сериализованные данные непосредственно в выходной канал? Джеффри совершенно правильно указывает, что очень большие сериализации могут не работать в 32-битных системах из-за длины строки.
Я часто использую %a
в своем коде, используя комбинируемые функции печати Батареи для создания пользовательских принтеров для моих значений:
let range_print oc r =
let print_one oc (a,b) = fprintf oc "%d:%d" a b in
List.print ~first:"" ~last:"" ~sep:"," print_one oc r
let print_rule print_pred print_dec oc r =
fprintf oc "%a,%a" print_pred r.pred print_dec r.dec
let print_item oc x = print_rule range_print Int.print oc x in
...
printf "IN : %a\nOUT: %a\n" print_item a print_item b;