Фильтр для списков в Clojure

Я предпочитаю просто возвращать пустой указатель и полагаться на вызывающую сторону для обработки его соответственно. (Из-за отсутствия лучшего слова) исключение - то, если я 'абсолютно уверен', что этот метод возвратит объект. В этом случае отказ является исключительным, должен и должен бросить.

5
задан Brian Carper 14 July 2009 в 20:03
поделиться

2 ответа

Предположим, у вас есть что-то вот так:

(def Person {:name "Bob" } ) 
(def Person2 {:name "Eric" } ) 
(def Person3 {:name "Tim" } ) 
(def mylist (list Person Person2 Person3))

Это сработает:

(filter #(not= "Eric" (get % :name)) mylist)
4
ответ дан 18 December 2019 в 07:31
поделиться

Для этого лучше использовать функцию «удалить». Он берет последовательность и удаляет элементы, для которых его предикат возвращает «истина». По сути, это противоположность фильтра. Вот пример этого и использования фильтра для тех же целей, которые я разработал с помощью REPL.

user> (def m1 {:name "eric" :age 32})
#'user/m1
user> (def m2 {:name "Rayne" :age 15})
#'user/m2
user> (def m3 {:name "connie" :age 44})
#'user/m3
user> (def mylist (list m1 m2 m3))
#'user/mylist
user> (filter #(not= (:name %) "eric") mylist)
({:name "eric", :age 32})
user> (remove #(= (:name %) "eric") mylist)
({:name "Rayne", :age 15} {:name "connie", :age 44})

Как видите, remove немного чище, потому что вам не нужно использовать not =. Кроме того, при работе с картами вам не нужно использовать функцию get, если вы не хотите, чтобы она возвращала что-то особенное, если ключа нет на карте. Если вы знаете, что ключ, который вы ищете, будет на карте, нет причин использовать «get». Удачи!

17
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: