我正在使用此功能写入Clojure中的文件。
(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)
我在这里做错了什么?
最佳答案
首先,对于许多输入,您的函数都可以正常工作:
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
的多个重载版本,而clojure不知道要调用哪个版本。在这种情况下,冲突的是write(char[])
和write(String)
。使用字符串("a"
)和整数(1
)之类的输入,clojure知道要调用该方法的String
版本,但是使用其他内容(例如clojure set,#{1}
)时,clojure无法决定。如何确保
writelines
的输入确实是String
或使用str
函数对其进行字符串化?另外,看看
spit
function。