Как проверить на пустой вектор в Clojure - PullRequest
13 голосов
/ 22 ноября 2011

Какой лучший способ проверить пустой вектор в Clojure?Я ожидал, что это выведет false:

(if [] "true" "false")

, но это не так.Это делает:

(if (> (count []) 0) "true" "false")

, но громоздко - есть ли более короткая конструкция?

Ответы [ 3 ]

30 голосов
/ 22 ноября 2011

Использовать стандартный предикат (empty? list)

18 голосов
/ 22 ноября 2011

Самый распространенный способ проверки непустого списка в коде Clojure - использовать seq . Это возвращает ноль, если коллекция пуста, или действительный объект seq в противном случае.

Пример использования:

(seq [])
=> nil

(seq nil)
=> nil

(seq [1 2 3])
=> (1 2 3)         ;; note this is a "true value"

(if (seq [1 4 6]) "true" "false")
=> "true"

(if (seq []) "true" "false")
=> "false"

Вы также можете использовать empty? , чтобы проверить обратное (т. Е. Проверить пустой набор). Обратите внимание, что пусто? реализован в исходном коде clojure как (not (seq coll)), так что вы можете быть в безопасности, зная, что оба подхода фундаментально эквивалентны.

0 голосов
/ 22 ноября 2011

В дополнение к ответу Мишадова (который более читабелен), вы также можете сравнить с самим пустым списком (и сохранить два символа в длину):

(if (= () []) "true" "false")

Хммм ... Я все еще думаю, что япредпочитаю ответ Мишадова.

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