Clojure извлечение значения из карты на основе приоритетной логики - PullRequest
5 голосов
/ 20 февраля 2012

У меня есть функция, которая хочет вытащить значение из карты на основе приоритетного порядка.В настоящее время я делаю это как вложенную структуру if, которая ужасна.Я должен верить, что есть лучший способ.

Хотя это работает, есть лучший способ?

(defn filter-relatives [relatives]
    (if(contains? relatives :self)
         (relatives :self)
             (if(contains? relatives :north)
                 (relatives :north)
                     (if(contains? relatives :west)
                         (relatives :west)
                         (if(contains? relatives :east)
                             (relatives :east)
                             (relatives :south)
                         )
                     )
                 )
              )
          )
    )
)

Ответы [ 4 ]

9 голосов
/ 20 февраля 2012
(some relatives [:self :north :west :east :south])
5 голосов
/ 20 февраля 2012

Другие ответы хороши, если nil и false не входят в число возможных значений.Если это так, вы можете использовать что-то вроде

(if-let [e (some (partial find relatives)
                 [:self :north :west :east :south])]
  (val e)
  :no-key-found)

Например

(if-let [e (some (partial find relatives)
                 [:self :north :west :east :south])]
  (val e)
  :no-key-found)
; => false

(if-let [e (some (partial find {})
                 [:self :north :west :east :south])]
  (val e)
  :no-key-found)
; => :no-key-found
5 голосов
/ 20 февраля 2012

Как насчет:

(defn filter-relatives [relatives ordered-filters] 
    (first (filter identity (map relatives ordered-filters))))

Пример прогона:

user=> (filter-relatives {:a 1 :b 2 :c 3} [:z :b :a])                                                               
2
1 голос
/ 21 февраля 2012
(first (keep relatives [:self :north :west :east :south]))
...