В clojure как выбрать значение, если nil
В Clojure что такое идиоматический способ тестирования для nil и если что-то nil, то заменить значение?
Например, я делаю это много:
let [ val (if input-argument input-argument "use default argument")]
: но я нахожу, что повторяю необходимость дважды использовать "вход-аргумент".
Ответы
Ответ 1
Предложение Alex "или" действительно является идиоматическим способом переписать ваш примерный код, но обратите внимание, что он не только заменит значения nil
, но и те, которые являются false
.
Если вы хотите сохранить значение false
, но отбросить nil
, вам нужно:
(let [val (if (nil? input-argument) "use default argument" input-argument)]
...)
Ответ 2
просто используйте или:
(or input-argument "default")
Ответ 3
Если вы привязываете только переменную, чтобы получить правильное значение, а не использовать его дважды, вы можете это сделать другим способом. В ядре называется функция fnil
.
Вы вызываете fnil
с помощью функции, которую хотите вызвать, и аргумента по умолчанию. Это вернет функцию, которая заменит nils на значение по умолчанию, которое вы указали.
Вы можете сделать одну из вещей в зависимости от того, что вы хотите. Создайте локальную функцию.
(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))
В somecases (где у вас всегда есть один и тот же аргумент по умолчанию) вы можете перейти к логике, чтобы сделать это из своего кода, и поместить его туда, где была исходная функция (или обернуть функцию в случае, если она находится в другой библиотеке).
(defn fn-you-want-to-call [arg] ....)
(def fn-you-want-to-call-default (fnil fn-you-want-to-call "default-argument"))
Затем в вашем коде сводится только к
(fn-you-want-to-call-default input-argument)
Подробнее вы можете найти здесь:
http://clojuredocs.org/clojure_core/clojure.core/fnil