2011-12-19 11 views
6

में एक फ़ाइल को लिखना मैं क्लोजर में एक फ़ाइल को लिखने के लिए इस फ़ंक्शन का उपयोग कर रहा हूं।क्लोजर


(defn writelines [file-path lines] 
    (with-open [wtr (clojure.java.io/writer file-path)] 
    (doseq [line lines] (.write wtr line)))) 

लेकिन यह हमेशा इस त्रुटि उत्पन्न:

IllegalArgumentException No matching method found: write for 
class java.io.BufferedWriter in 
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79) 

क्या मैं गलत यहाँ कर रहा हूँ?

+0

क्या आप अतिरिक्त स्पष्टता के लिए, अपने प्रश्न में एक उदाहरण फ़ंक्शन कॉल जोड़ सकते हैं? यह opqdonut के जवाब की पुष्टि करने की संभावना है। – Gert

+0

आपके प्रश्न का उत्तर नहीं है, लेकिन इस संदर्भ में दिलचस्प हो सकता है: http://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file/ 7757674 # 7757674 –

उत्तर

17

सबसे पहले, अपने कार्य में कई आदानों के लिए बस ठीक काम करता है:

Clojure 1.3.0 
user=> (defn writelines [file-path lines] 
    (with-open [wtr (clojure.java.io/writer file-path)] 
    (doseq [line lines] (.write wtr line)))) 
#'user/writelines 
user=> (writelines "foobar" ["a" "b"]) 
nil 
user=> (writelines "quux" [1 2]) 
nil 

हालांकि, जब आप कुछ अजीब में पारित करने के लिए कोशिश हम मिल त्रुटि आप का वर्णन:

user=> (writelines "quux" [#{1}]) 
IllegalArgumentException No matching method found: write for class java.io.BufferedWriter clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79) 

यह त्रुटि ऐसा इसलिए है क्योंकि BufferedWriter में write के एकाधिक अधिभारित संस्करण हैं और क्लोजर को यह नहीं पता कि कौन से कॉल करना है। इस मामले में विरोधाभासी write(char[]) और write(String) हैं। तारों जैसे इनपुट ("a") और पूर्णांक (1) क्लोजर विधि के String संस्करण को कॉल करना जानता था, लेकिन कुछ और (उदाहरण के लिए एक क्लोजर सेट, #{1}) क्लोजर निर्णय नहीं ले सका।

या तो यह सुनिश्चित करने के बारे में कि writelines पर इनपुट वास्तव में String एस हैं या उन्हें str फ़ंक्शन का उपयोग करके स्ट्रिंग कर रहे हैं?

इसके अलावा, spit function पर एक नज़र डालें।

+0

नोट: यदि आप मनमाने ढंग से नेस्टेड क्लोजर मान को स्ट्रिंग करना चाहते हैं, तो 'str' के बजाय 'pr-str' का उपयोग करना बेहतर है। यदि परिणामी स्ट्रिंग को सीधे स्ट्रीम में खिलाया जाता है, तो आपको दो-चरण 'पीआर-स्ट्र' के बजाय 'प्रिंट' या '.write' के बजाय' pr' (या 'prn') का उपयोग करना चाहिए। – raek

0

अपवाद संदेश के आधार पर, रेखाएं स्ट्रिंग्स, इन्ट्स (वर्ण) या int arrays की एक सीक नहीं है।

1

इस प्रयास करें:

(defn writelines [file-path lines] 
    (with-open [wtr (clojure.java.io/writer file-path)] 
    (binding [*out* wtr] 
     (doseq [line lines] (print wtr line))))) 

आप BufferedWriter के लिए दस्तावेज़ को देखें, तो आप जिस तरह से आप write बुला रहे थे करने के लिए कोई इसी विधि देखेंगे (ओह, मैं विरासत में मिला तरीकों, मुझे मूर्ख याद किया!)। *out* पर बाध्यकारी बस इतना आसान है, मुझे लगता है (जब तक कि आप डिबगिंग जानकारी को आउटपुट भी नहीं करना चाहते हैं, इस मामले में यह थोड़ा सा ट्रिकियर हो सकता है)।