我正在使用此功能写入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

10-01 05:04
查看更多