Estoy creando registros en Clojure y me gustaría configurar algunos campos con un valor predeterminado. ¿Cómo puedo hacer esto?¿Cómo establecer los valores predeterminados para los campos en los registros en Clojure?
13
A
Respuesta
10
Puede pasar valores iniciales a un registro bastante facilidad cuando cree que a pesar de un mapa de extensión:
(defrecord Foo [])
(def foo (Foo. nil {:bar 1 :baz 2}))
A la luz de esto, por lo general crear una función de constructor que se funde en algunos valores por defecto (que se puede anular como desee):
(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
Utilice una función de constructor.
(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)
Por supuesto, hay varias variaciones. Por ejemplo, podría requerir que ciertos campos sean no opcionales y sin un valor predeterminado.
(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
Después de tener la misma pregunta, terminé envolviendo el defrecord y la función de fábrica en una definición única usando una macro.
La macro:
(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#)))))))
Uso
(make-model User [firstName lastName] {:lastName "Smith"})
=> #'user/make-user
(make-user {:firstName "John"})
=> #user.User{:firstName "John", :lastName "Smith"}
Cuestiones relacionadas
- 1. ¿Cómo establecer los valores predeterminados para los parámetros de los métodos de url helper?
- 2. ¿Cómo registro los valores predeterminados en MonoTouch?
- 3. Cómo establecer los valores predeterminados del diálogo JTry UI
- 4. establecer los valores de campos de formulario en ExtJS
- 5. ¿Cómo puedo establecer los argumentos predeterminados para "ls" en Linux?
- 6. Establecer los valores predeterminados para el estado, Clase de impuestos en Magento
- 7. comportamiento de los valores predeterminados inconsistentes (NSUserDefaults) en los valores predeterminados del simulador de iPhone
- 8. jquery.validation - cómo ignorar los valores predeterminados al validar los campos obligatorios
- 9. cómo establecer los valores a los símbolos
- 10. SingleOrDefault: ¿Cómo cambiar los valores predeterminados?
- 11. ¿Los valores enum predeterminados en C son los mismos para todos los compiladores?
- 12. ¿Cuáles son los valores predeterminados para @property en iOS?
- 13. Rieles: ¿Cómo encuentro() todos los registros únicos en ciertos campos?
- 14. ¿Cómo se restablecen los valores predeterminados para VI?
- 15. Establecer los botones predeterminados "Aceptar" y "Cancelar"
- 16. cambiar los valores predeterminados de un Plugin
- 17. Cómo puedo anular los valores predeterminados en jQuery Fullcalendar
- 18. XML Serialización de los valores predeterminados de los atributos opcionales
- 19. Django establece los valores de formulario predeterminados
- 20. MVC redirigir a los valores predeterminados ruta
- 21. GetPrivateProfileInt- leyendo solo los valores predeterminados
- 22. Configuración de los valores predeterminados de AssemblyInfo.cs
- 23. ¿Cómo reemplazar los valores en blanco (nulos) con 0 para todos los registros?
- 24. Cómo establecer los valores predeterminados para las especificaciones del cliente ejecutable
- 25. establecer los campos objeto de HashMap
- 26. Cómo configurar los valores predeterminados para un parámetro con varios valores para un plugin Maven
- 27. ¿Cómo registrar los valores predeterminados del usuario utilizando NSUserDefaults sin sobreescribir los valores existentes?
- 28. Acceso a los valores de argumento predeterminados en Python
- 29. Rails valores predeterminados de la base de datos y validación de modelo para los campos booleanos
- 30. La redefinición de los campos de un registro en Clojure
enlace que explica el uso de *: teclas * y *: * o http://stuartsierra.com/2010/01/15/ keyword-arguments-in-clojure – leeor
uno también podría utilizar 'map-> Foo' y/o' -> Foo' como '(defn make-foo [& args] (map-> Foo (en args {: a 5 : b 1: c 7})) (make-foo {: b 3}) '- ahorra un poco de desestructuración – birdspider