Запись в файл в Clojure - PullRequest
       2

Запись в файл в Clojure

6 голосов
/ 19 декабря 2011

Я использую эту функцию для записи в файл в 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)

Что я здесь не так делаю?

Ответы [ 3 ]

17 голосов
/ 19 декабря 2011

Прежде всего, ваша функция прекрасно работает для многих входов:

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, #{1}) clojure не мог решить.1015 *

Как насчет того, чтобы убедиться, что входные данные для writelines действительно String s, или для их строкового преобразования с использованием функции str?

Также взгляните на spit функция .

1 голос
/ 19 декабря 2011

Попробуйте это:

(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* намного проще во всех отношениях (если только вы не хотите выводить отладочную информацию, в этом случае это может быть немного сложнее).

0 голосов
/ 19 декабря 2011

Судя по сообщению об исключении, строки не являются последовательностями строк, целых (символов) или массивов int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...