2011-03-29 106 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*宏。

相关问题