使用%a
可以让打印直接进入输出通道,而不是“%s”并将要打印的值串化并打印出来。
这种区别看起来完全是效率问题 - 为什么当将串行化数据直接发送到输出通道是可能和合理的时候,为什么要分配一个潜在的大字符串(或者使用缓冲区,并进行指数大小调整和复制) ? Jeffrey非常正确地指出,由于字符串长度的原因,非常大的串行化可能会在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;
'sprintf'和'ksprintf'采取单位的'功能 - >“A - >字符串不像你提到的功能。 – nlucaroni
我的问题可能很不精确。我想知道的是,在什么情况下,人们应该更喜欢使用'%a'而不是仅仅打印到一个字符串(使用'printf'和'%s'或'sprintf'或'ksprintf'等)并且然后使用该字符串执行其他操作 - 例如在通道上输出。 – ndbd