2013-06-15 16 views
7

, ben Ancak, printf çıktı bir türOCaml'de biçimlendirilmiş dize nasıl alınır? OCaml yılında

Printf.printf "Hello %s %d\n" world 123 

gibi, çıkış biçimlendirilmiş dize Printf.printf kullanabilirsiniz.


Dilediğim şey bir çıkış için değil, bir dize içindir. Örneğin, ben o zaman ben bunu nasıl s = "Hello World 123"


alabilirsiniz

let s = something "Hello %s %d\n" "world" 123 

istiyor?

cevap

12

Sen Printf.sprintf kullanabilirsiniz:

# Printf.sprintf "Hello %s %d\n" "world" 123;; 
- : string = "Hello world 123\n" 
+0

Bu gibi tanımlayabilir miyim: 'fmt =" Merhaba% s% d \ n ";; Printf.sprintf fmt "dünya" 123'? –

+3

@JacksonTale, gerçekten emin değilim. Görünüşe göre '' fmt = Printf.sprintf '' Hello% s% d \ n '; fmt "dünya" 123 ;; 'ancak. – zch

+0

@JacksonTale: Eğer bu şekilde yaparsanız, yanlış türde (biçim şeyleri yerine dize) çıkacaktır. OCaml'da dizeler ve biçim şeyleri arasındaki dizgi değişmezleri için bir "aşırı yükleme" var. Doğru olanı yapmak için, 'format_of_string' işlevini kullanmalısınız (bu bir tanımlama işlevidir, ancak tür sistemine yardımcı olur):' fmt = format_of_string '' Hello% s% d \ n '; Printf.sprintf fmt "dünya" 123'. Ya da belki bunu yapabilirsin (eğlenceli fmt -> Printf.sprintf fmt "dünya" 123) "Eğer yeterliyse Hello% s% d \ n" '. – newacct

5

Bunu yapabilirsin:

$ ocaml 
     OCaml version 4.00.1 

# let fmt = format_of_string "Hello %s %d";; 
val fmt : (string -> int -> '_a, '_b, '_c, '_d, '_d, '_a) format6 = <abstr> 
# Printf.sprintf fmt "world" 123;; 
- : string = "Hello world 123" 

(adından da anlaşılacağı gibi) format_of_string fonksiyonu bir biçime değişmez bir dize dönüştürür. Derleyici sihrinin söz konusu olması nedeniyle, biçimlerin sonuçta dize değişmezlerinden oluşması gerektiğini unutmayın. Örneğin bir dizede okuyamaz ve bir biçim olarak kullanamazsınız.