2011-03-29 161 views

回答

32
(with-out-str (println "this should return as a string")) 
+0

來自優秀的http://clojuredocs.org/quickref/Clojure%20Core網站。 – 2011-03-29 11:33:37

3

米歇爾的完全正確。因爲我不能在他的回答評論添加代碼,這裏就是with-out-str在幕後做,這樣你就可以用你嘗試比較一下:

user=> (macroexpand-1 '(with-out-str (println "output"))) 
(clojure.core/let [s__4091__auto__ (new java.io.StringWriter)] 
    (clojure.core/binding [clojure.core/*out* s__4091__auto__] 
    (println "output") 
    (clojure.core/str s__4091__auto__))) 

你的代碼中存在的標準輸出流被綁定到一個變量,打印到該流,然後通過變量向流索取值;但是,流的值當然不是已經打印到它的字節。因此with-out-str暫時將新創建的StringWriter綁定到*out*,最後查詢該臨時寫入器的字符串值。

7

只是爲了擴大一點Michiel的答案,當你想捕獲輸出到一個文件,你可以結合與spit

當你不想在寫出內存時在內存中建立一個巨大的字符串,那麼你可以使用clojure.contrib.io庫中的with-out-writer

with-out-writer是在執行其體內的代碼,很好地概括在該文件的正確開啓和文件資源的關閉和作家的結合*out*宏。

相關問題