2011-03-29 8 views
15

मेरे पास कुछ प्रिंटल हैं जिन्हें मुझे क्लोजर प्रोग्राम से कैप्चर करने की आवश्यकता है और मैं सोच रहा था कि मैं आउटपुट कैप्चर कैसे कर सकता हूं?मैं क्लोजर के मानक आउटपुट को कैप्चर कैसे कर सकता हूं?

मैं कोशिश की है:

(binding [a *out*] 
    (println "h") 
    a 
) 

: लेकिन इस

उत्तर

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

उत्कृष्ट http://clojuredocs.org/quickref/Clojure%20 कोर साइट से। –

3

Michiel की बिल्कुल सही काम नहीं करता। जब से मैं अपने जवाब पर एक टिप्पणी में कोड नहीं जोड़ सकते हैं, यहाँ क्या 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

मिचिल के जवाब पर थोड़ा विस्तार करने के लिए, जब आप किसी फ़ाइल में आउटपुट कैप्चर करना चाहते हैं तो आप spit के साथ जोड़ सकते हैं।

जब आप इसे लिखने से पहले स्मृति में एक बड़ी स्ट्रिंग बनाना नहीं चाहते हैं तो आप लाइब्रेरी से with-out-writer का उपयोग कर सकते हैं।

with-out-writer मैक्रो अच्छी तरह से *out* के लिए उस फ़ाइल पर सही खोलने और फ़ाइल संसाधन के समापन और एक लेखक के बंधन समाहित अपने शरीर में कोड निष्पादित करते समय है।

संबंधित मुद्दे

 संबंधित मुद्दे