我正在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