Вкратце, почему разделение строки из пустого файла возвращает 1 элемент? - PullRequest
5 голосов
/ 22 июня 2011

Рассмотрим следующее:

=> (even? (count []))
true

пока все хорошо. Теперь рассмотрим (предположим, что my-file пуст):

(odd? (count (str/split (slurp my-file) #"\|")))
true

ошибка ... почему вектор, возвращаемый из пустого файла, не четен (ноль)?

=>(str/split (slurp my-file) #"\|")
[""]

Ааа, может кто-нибудь объяснить, почему в этом случае возвращается пустая строка?

Я пытаюсь определить, есть ли в файле нечетное количество записей.

1 Ответ

7 голосов
/ 22 июня 2011

clojure.string/split использует java.util.regex.Pattern/split для разделения.См. этот вопрос о Java для объяснения.А именно, split возвращает все до первого совпадения вашего шаблона в качестве первого разбиения, даже если шаблон вообще не совпадает.

Канонический способ проверить, является ли коллекция (список, массив, карта, строка и т. д.) пуста или нет - это вызов seq для него, который вернет nil для пустой коллекции.

(defn odd-number-of-records? [filename]
  (let [txt (slurp filename)]
    (when (seq txt)
      (odd? (count (str/split txt #"\|"))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...