2012-11-03 11 views
6

मैंने एक फ़ंक्शन परिभाषित किया है जो नक्शा लेता है। मैंने मूल्यों तक पहुंचने के लिए विनाश का उपयोग करना सोचा। हालांकि, मैं यह भी जांचना चाहता हूं कि कोई भी उपयोग की जाने वाली चाबियाँ हैं या नहीं।क्लोजर में मानचित्रों को नष्ट करना - अप्रयुक्त कुंजी

तो, उदाहरण के कुछ तरह के लिए ...

(defun func1 [{:keys [a b c] :rest rest}] 
    (println a b c) 
    (println rest)) 

(func1 {:a 1 :b 2 :c 3 :d 4}) 

जो

1 2 3 
4 

कारण मैं चाहता हूँ कि यह करता है, तो बाकी रिक्त नहीं है, यह शायद एक त्रुटि है मुद्रित होता है, जो मैं सिग्नल करना चाहता हूं। मुझे पता है: जैसा कि मैं उपयोग कर सकता था। लेकिन फिर मुझे वैध कुंजी की सूची दो बार स्टोर करने की आवश्यकता है।

क्या मुझे कुछ याद आ रही है?

फिल

उत्तर

5

मैं सच में समझ में नहीं आता क्यों आप कभी भी पता करने के लिए अगर वहाँ चीजें हैं जो आप के बारे में वैसे भी परवाह नहीं है कर रहे हैं चाहते हैं। आप की तरह कुछ करने के लिए कोशिश कर रहे हैं "कुछ इन कुंजी के साथ विशिष्ट करते हैं, और कुछ अन्य लोगों के साथ सामान्य कर" यदि आप की तरह कुछ कर सकता है:

(defn func [& {:keys [a b] :as args}] 
    (println a b c) 
    (println (dissoc args :a :b))) 

(func :a 3 :b :c 5) => 
    3 4 
    {:c 5} 
    nil 

आप खोजशब्दों दो बार उल्लेख करने के लिए होने के बारे में पागल हैं, आप शायद इसके बारे में कुछ भी कर सकते हैं, लेकिन मैं कल्पना नहीं कर सकता कि यह परेशान होगा।

कारण मैं चाहता हूँ कि यह करता है, तो बाकी रिक्त नहीं है, यह शायद एक त्रुटि है, जो मैं संकेत करना चाहते हैं है।

आपको लगता है कि के बारे में चिंतित उन नहीं में गुजर रहे हैं वास्तव में आप क्या चाहते हैं, शायद एक नक्शा नहीं उपयोग करने का अधिकार डेटा संरचना है।

+0

मेरा तर्क यह है कि यदि वे गलत कुंजी में गुजरते हैं, तो शायद यह एक गलती है। मैंने एक मानचित्र का उपयोग किया है क्योंकि यह एक समझदार पर्याप्त विकल्प लग रहा था। सुनिश्चित नहीं है कि एक बेहतर विकल्प क्या होगा। फ़ंक्शन को पैरामीटर के परिभाषित सेट के किसी भी संख्या (सहित कोई भी) लेने की आवश्यकता नहीं है। आप किस डेटा संरचना का सुझाव देंगे? –

+1

बेशक उस परिदृश्य में एक नक्शा अभी भी सबसे अच्छा है, मुझे अभी भी यह नहीं पता कि आप खुद को सीमित क्यों करेंगे (या इसके बजाय: आपके उपयोगकर्ता!)। यह जरूरी नहीं है कि वे "गलत" कुंजी में गुजर रहे हैं, बल्कि उनके पास विशेषताओं का एक बड़ा नक्शा है जो आपके कार्य के लिए जरूरी नहीं हैं। – Cubic

+0

आह, हाँ, यह सच है।मैं प्रभावी रूप से एक डीएसएल लागू कर रहा हूँ। इसलिए, इस मामले में, मूल्य कहीं और से उत्पन्न होने के बजाय उपयोगकर्ता द्वारा सीधे लिखे जाने की संभावना है। तो वे गुणों का एक बड़ा नक्शा होने की संभावना नहीं है। अगर उन्होंने किया, तो वे हमेशा मेरे प्रतिबंध के आसपास काम करने के लिए चुनिंदा कुंजी का उपयोग कर सकते थे। –

1

आप किसी दिए गए नक्शे के लिए एक संरचना को लागू करने के बारे में परवाह है, तो Schema एक अच्छा विकल्प (README से पहला उदाहरण) हो सकता है:

(ns schema-examples 
    (:require [schema.core :as s 
      :include-macros true ;; cljs only 
      ])) 

(def Data 
    "A schema for a nested data type" 
    {:a {:b s/Str 
     :c s/Int} 
    :d [{:e s/Keyword 
     :f [s/Num]}]}) 

(s/validate 
    Data 
    {:a {:b "abc" 
     :c 123} 
    :d [{:e :bc 
     :f [12.2 13 100]} 
     {:e :bc 
     :f [-1]}]}) 
;; Success! 

(s/validate 
    Data 
    {:a {:b 123 
     :c "ABC"}}) 
;; Exception -- Value does not match schema: 
;; {:a {:b (not (instance? java.lang.String 123)), 
;;  :c (not (integer? "ABC"))}, 
;; :d missing-required-key} 
0

(फिल हे प्रभु, ओपी कोई संदेह नहीं है पर दूसरे के लिए ले जाया गया है समस्याओं, लेकिन यहाँ एक ऐसी ही सवाल के साथ किसी के लिए एक संभव समाधान है)

आप count इस्तेमाल कर सकते हैं नक्शा चाबियों का सही संख्या है कि क्या परीक्षण करने के लिए:।

(count {:a 1 :b 2 :c 3 :d 4}) ;=> 4 

यह कुंजी/वैल जोड़े की संख्या देता है। जब तक आप अलग-अलग परीक्षण कर रहे हों कि मानचित्र में आवश्यक कुंजी है, यह जानकर कि बहुत सी कुंजी आपको बताएंगी कि कोई अतिरिक्त विकल्प हैं या नहीं।

+1

अच्छा विचार है, लेकिन यह मेरी समस्या का समाधान नहीं करेगा, क्योंकि आप मान रहे हैं कि आपको सभी चाबियाँ पास करनी होंगी। मुझे केवल कुछ चाबियाँ पास करने में सक्षम होने की आवश्यकता थी, लेकिन गलत नहीं। अंत में, मैं एक अलग मार्ग चला गया और इसे नष्ट करके ऐसा नहीं किया क्योंकि मुझे तर्कों की एक बहुत अधिक धनराशि की आवश्यकता थी। –

+0

आह, मैं समझता हूं। शायद यह किसी और की मदद करेगा। – Mars

+0

वास्तव में, विचार पोस्ट करने के लिए धन्यवाद! –

संबंधित मुद्दे