使用%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