Я определил запись с кучей полей - некоторые из них вычисляются, некоторые из которых не отображаются непосредственно в ключи в данных JSON, которые я глотаю , Я пишу для него заводскую функцию, но хочу иметь разумные значения по умолчанию/не найденные. Есть ли лучший способ, который накладывается на :or [field1 "" field2 "" field3 "" field4 ""...]
? Я мог бы написать макрос, но я бы предпочел, если мне это не нужно.clojure same ": или" значение для всех ключей
ответ
Существует три распространенных идиома для реализации значений по умолчанию в конструкторских функциях.
:or
destructoringПример:
(defn make-creature [{:keys [type name], :or {type :human name (str "unnamed-" (name type))}}] ;; ... )
Это полезно, если вы хотите, чтобы указать значения по умолчанию рядный. В качестве бонуса он позволяет устанавливать привязки стиля
let
на карте:or
, где kvs упорядочены в соответствии с вектором:keys
.Слияния
Пример:
(def default-creature-spec {:type :human}) (defn make-creature [spec] (let [spec (merge default-creature-spec spec)] ;; .... ))
Это полезно, если вы хотите, чтобы определить значения по умолчанию извне, создавать их во время выполнения и/или использовать их в другом месте.
Простой
or
Пример:
(defn make-creature [{:keys [type name]}] (let [type (or type :human) name (or name (str "unnamed-" (name type)))] ;; ... ))
Это так полезно, как
:or
destructoring, но только те значения по умолчанию вычисляются, которые действительно необходимы, т.е.. е. он должен использоваться в случаях, когда вычисление по умолчанию добавляет нежелательные служебные данные. (Я не знаю, почему:or
оценивает все значения по умолчанию (как на Clojure 1.7), поэтому это обходное решение).
Если вы действительно хотите одинаковое значение по умолчанию для всех полей, и они действительно должны отличаться от nil
, и вы не хотите записывать их снова, то вы можете получить поля записи, позвонив по номеру keys
пустой экземпляр, а затем построить карту со значениями по умолчанию слился с фактическими значениями:
(defrecord MyFancyRecord [a b c d])
(def my-fancy-record-fields (keys (map->MyFancyRecord {})))
;=> (:a :b :c :d)
(def default-fancy-fields (zipmap my-fancy-record-fields (repeat "")))
(defn make-fancy-record [fields]
(map->MyFancyRecord (merge default-fancy-fields
fields)))
(make-fancy-record {})
;=> {:a "", :b "", :c "", :d ""}
(make-fancy-record {:a 1})
;=> {:a 1, :b "", :c "", :d ""}
Чтобы получить список полей записи можно также использовать статический метод getBasis
на запись класса:
(def my-fancy-record-fields (map keyword (MyFancyRecord/getBasis)))
(getBasis
не является частью публичных записей api, поэтому нет гарантий, что он не будет удален в будущих версиях clojure. Сейчас он доступен как в clojure, так и в clojurescript, его использование объясняется в «Программе Clojure от Chas Emerick, Brian Carper, Christophe Grand», и также упоминается in this thread во время обсуждения того, как получить ключи от записи. Итак, решать вам, стоит ли использовать его)
- 1. Same SlidingDrawer во всех мероприятиях?
- 2. Проверить routingata.values для всех ключей
- 3. mapValues lodash для всех ключей
- 4. MongoDB обновить значение для всех ключей на основе функции питона
- 5. Словарь, по-видимому, вытягивает одинаковое значение для всех ключей (VBA)
- 6. Значение ключевого кода возвращается как 229 для всех ключей
- 7. массив Javascript, изменять значения для всех ключей
- 8. Сравнение нескольких массивов для всех ключей
- 9. Same ExceptionMapper для разных исключений
- 10. Перечисление всех ключей и значений
- 11. WCF Same IParameterInspector для всех операций над сервисом
- 12. Удаление всех основных ключей
- 13. Поиск ключей, ближайших к заданному значению для сортированных карт clojure
- 14. обход всех ключей массива
- 15. Same ZMQ_IDENTITY для нескольких подписчиков
- 16. Применить определенные ключи для всех ключей SimpleSchemas
- 17. NSMutableDictinary - Добавить префикс для всех ключей
- 18. Clojure «одинаковое значение» распределение
- 19. Добавить пару ключей значение для существующего массива или объединить их
- 20. Отображение всех ключей Значение пары массивов в вложенном json javascript
- 21. Clojure - список всех перестановок списка
- 22. Удаление ключей из карты с помощью Clojure
- 23. Настройка всех ключей на то же значение с помощью итератора
- 24. Hyphenating underscored Clojure карты ключей для результатов базы данных
- 25. Список всех ключей/значений memcached
- 26. Изменение всех ключей в массиве
- 27. Clojure фильтр вложена карта для возврата ключей, основанных на внутренней карте значение
- 28. ReactJS - листинг всех ключей сразу
- 29. Получение значения всех ключей - PHP
- 30. ИЛИ множественная фильтрация Clojure
Почему '' или {...} 'не будет достаточно хорошим? Что квалифицирует что-то лучшее, чем это? – bsvingen
«Слияние» может быть более явным, чем использование ': или' в деструктурировании, а' rename-keys' может помочь с разными именами ключей, но это трудно сказать, не видя полного кода – nberger