我正在Clojure中創建記錄,並希望將某些字段設置爲默認值。我怎樣才能做到這一點?如何在Clojure的記錄中爲字段設置默認值?
13
A
回答
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)
YMMV。
1
有了同樣的問題後,我最終使用宏將defrecord和factory函數包裝成一個單一的定義。
宏:
(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"}
相關問題
- 1. 如何在Odoo 9.0c中爲many2one字段設置默認值?
- 2. 從one2many字段創建記錄時設置默認值 - odoo
- 3. 如何將auth.user.id設置爲SQLFORM中字段的默認值
- 4. 如何爲Xamarin設置Realm中字段的默認值
- 5. 如何使每個新記錄的字段默認值爲?
- 6. 如何設置默認值以在delphi中記錄
- 7. 如何設置默認值在MySQL字段爲空
- 8. 如何在Drupal中爲位置元素的位置字段設置默認值?
- 9. 記錄字段沒有默認值
- 10. 如何在CakePHP的輸入字段中設置默認值?
- 11. 如何將表格字段的默認值設置爲0.00?
- 12. AVAudioRecorder默認記錄設置
- 13. 設置隱藏字段的默認值
- 14. 在Sharepoint的Schema.xml中爲DateTime字段設置默認值
- 15. 如何在Clojure中設置默認數字格式?
- 16. 如何在@Entity對象字段中設置默認值
- 17. 在Clojure項目中將複雜算術設置爲默認值
- 18. 如何爲jqGrid單一搜索字段設置默認值
- 19. Crafter CMS - 如何爲複選框組字段設置默認值?
- 20. 如何從odoo中的xml代碼設置默認字段值?
- 21. 如何通過odoo中的many2one字段設置默認值?
- 22. 在java中爲avro模式字段設置默認值
- 23. 將字段的默認值設置爲參數的值
- 24. 將默認值設置爲模式已具有默認值的字段
- 25. 如何在jibx綁定中的字段爲空時設置默認值?
- 26. Clojure:更新記錄字段的值
- 27. 爲XStream中不是XML的字段設置默認值
- 28. 將默認值設置爲React中的輸入字段?
- 29. 的Django 1.6,如何設置字段默認值CreateView的
- 30. 如何在DropDownListFor中設置默認值
鏈接,解釋瞭如何使用*的:鑰匙*和*:或* http://stuartsierra.com/2010/01/15/關鍵字參數在clojure – leeor 2015-08-09 21:36:48
人們也可以利用'map-> Foo'和/或' - > Foo'就像這樣(defn make-foo [&args](map-> Foo(into args {:a 5 :b 1:c 7}))(make-foo {:b 3})' - 它節省了一些解構 – birdspider 2016-07-04 15:19:55