2012-02-20 12 views
5

पर आधारित मानचित्र से क्लोजर निकालने का मूल्य मेरे पास एक ऐसा फ़ंक्शन है जो प्राथमिकता वाले आदेश के आधार पर मानचित्र से मूल्य खींचना चाहता है। वर्तमान में मैं इसे घोंसला के रूप में कर रहा हूं अगर संरचना भयानक है। मुझे विश्वास है कि एक बेहतर तरीका है।प्राथमिकता वाले तर्क

हालांकि यह काम एक बेहतर तरीका है?

(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) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

उत्तर

9
(some relatives [:self :north :west :east :south]) 
+1

यह सही जवाब है। –

+1

... जब तक कि आप शून्य मान भी प्राप्त नहीं करना चाहते हैं। –

+3

... या 'झूठा'। यदि यह कोई मुद्दा है, तो उचित उत्तर के लिए मेरा उत्तर देखें, अन्यथा निश्चित रूप से इसका उपयोग करें। –

5

के बारे में क्या:

(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 
5

अन्य उत्तर यदि 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 
1
(first (keep relatives [:self :north :west :east :south])) 
संबंधित मुद्दे