2016-06-22 18 views
1

Ich versuche Format.fprintf für ein Stück Code in einem Modul zu verstehen und zu verwenden. Ich habe eine Funktion wie dieseWie wird eine hübsch gedruckte Zeichenfolge mit der Funktion Format.fprintf zurückgegeben?

let some_function fmt s = match s with 
    | For(exp,_) -> Format.fprintf fmt "something here" 
    | Assume x-> Format.fprintf fmt "something here as well" 

ich diese Funktion ändern möchten einen String zurück. Printf.sprintf ist keine Option wegen einiger hübscher Drucker, die ich im ursprünglichen Code verwende. Bitte helfen Sie.

+1

[ 'Format.sprintf'] (http://caml.inria.fr/pub/docs/manual-ocaml/libref/Format.html#VALsprintf) ? – pdexter

Antwort

3

Verwendung Format.asprintf:

let string_of_s = Format.asprintf "%a" some_function s 

Ich empfehle Format.sprintf nicht zu verwenden, da es nur eine begrenzte Art hat. Zum Beispiel führt die folgenden nicht typ überprüfen:

let string_of_s_ill_typed = Format.sprintf "%a" some_function s 
+0

Entsprechend dem Dokument kann Format.fprintf auf eine Zeichenkette drucken. Können wir diese Funktion verwenden, um eine Zeichenfolge von der obigen Funktion zurückzugeben? Ich meine 'fprintf' verwenden, um in eine Zeichenfolge zu schreiben und dieselbe – user3586612

+0

Sie können 'str_formatter' verwenden, ein spezieller Formatierer, um die Ausgabe von' fprintf' in einen Puffer anstelle von normalen Kanälen umzuleiten. BUt hat einige Nachteile: Sie müssen 'flush_str_formatter' aufrufen, um das Zeichenfolgenresultat zu erhalten, und' str_formatter' ist ein globaler Zustand und daher fehleranfällig im Vergleich zu 'asprintf'. – camlspotter