2011-04-12 12 views
13

मैं क्लोजर में रिकॉर्ड बना रहा हूं और कुछ फ़ील्ड को डिफ़ॉल्ट मान के साथ सेट करना चाहता हूं। मैं यह कैसे कर सकता हूँ?क्लोजर में रिकॉर्ड्स में फ़ील्ड के लिए डिफ़ॉल्ट मान कैसे सेट करें?

उत्तर

10

आप बहुत आसानी से एक रिकॉर्ड करने के लिए प्रारंभिक मान पारित कर सकते हैं जब आप हालांकि एक विस्तार नक्शा यह निर्माण: (

(defrecord Foo []) 

(def foo (Foo. nil {:bar 1 :baz 2})) 

इस के प्रकाश में, मैं आमतौर पर एक निर्माता समारोह है कि कुछ मूलभूत मूल्यों में विलीन हो जाती है बनाते हैं तो आप जो जैसा चाहें ओवरराइड कर सकते हैं):

(defn make-foo [values-map] 
    (let [default-values {:bar 1 :baz 2}] 
    (Foo. nil (merge default-values values-map)))) 

(make-foo {:fiz 3 :bar 8}) 
=> #:user.Foo{:fiz 3, :bar 8, :baz 2} 
20

एक कन्स्ट्रक्टर फ़ंक्शन का उपयोग करें।

(defrecord Foo [a b c]) 

(defn make-foo 
    [& {:keys [a b c] :or {a 5 c 7}}] 
    (Foo. a b c)) 

(make-foo :b 6) 
(make-foo :b 6 :a 8) 

बेशक विभिन्न भिन्नताएं हैं। उदाहरण के लिए आप कुछ फ़ील्ड को गैर-वैकल्पिक और डिफ़ॉल्ट के बिना आवश्यक कर सकते हैं।

(defn make-foo 
    [b & {:keys [a c] :or {a 5 c 7}}] 
    (Foo. a b c)) 

(make-foo 6) 
(make-foo 6 :a 8) 

वाईएमएमवी।

+0

लिंक जो * के उपयोग बताते हैं: कुंजी * और *: या * http://stuartsierra.com/2010/01/15/ कीवर्ड-तर्क-इन-क्लोजर – leeor

+0

कोई भी 'नक्शा-> Foo' और/या '-> Foo' का उपयोग भी कर सकता है' (defn make-foo [& args] (map-> Foo (args {: a 5 में : बी 1: सी 7})) (मेक-फू {: बी 3}) '- यह कुछ विनाशकारी बचाता है – birdspider

1

एक ही प्रश्न होने के बाद, मैंने एक मैक्रो का उपयोग करके एक ही परिभाषा में defrecord और कारखाने को लपेटकर समाप्त कर दिया।

मैक्रो:

(defmacro make-model 
    [name args & body] 
    (let [defaults (if (map? (first body)) (first body) {}) 
     constructor-name (str/lower-case (str "make-" name))] 
    `(do (defrecord ~name ~args [email protected](if (map? (first body)) (rest body) body)) 
     (defn ~(symbol constructor-name) 
      ([] (~(symbol constructor-name) {})) 
      ([values#] (~(symbol (str "map->" name)) (merge ~defaults values#))))))) 

प्रयोग

(make-model User [firstName lastName] {:lastName "Smith"}) 
=> #'user/make-user 
(make-user {:firstName "John"}) 
=> #user.User{:firstName "John", :lastName "Smith"} 
संबंधित मुद्दे