В Clojure, как выбрать значение, если ноль - PullRequest
21 голосов
/ 17 апреля 2011

В Clojure, каков идиоматический способ проверки на ноль, и если что-то равно нулю, то подставить значение?

Например, я часто это делаю:

 let [ val    (if input-argument input-argument "use default argument")]

: но я нахожу повторяющимся необходимость использовать «входной аргумент» дважды.

Ответы [ 3 ]

77 голосов
/ 17 апреля 2011

просто используйте или :

(or input-argument "default")
19 голосов
/ 17 апреля 2011

Предложение Алекса о «или» действительно является идиоматическим способом переписать ваш пример кода, но учтите, что он не будет только заменять nil значения, но также и значениями, которые false.

Если вы хотите сохранить значение false, но отбросить nil, вам необходимо:

(let [val (if (nil? input-argument) "use default argument" input-argument)]
   ...)
7 голосов
/ 18 апреля 2011

Если вы связываете переменную только для того, чтобы получить правильное значение и не используете его дважды, есть другой способ сделать это. В ядре есть функция с именем fnil.

Вы вызываете fnil с функцией, которую хотите вызвать, и аргументом по умолчанию. Это вернет функцию, которая заменит nils заданным вами значением по умолчанию.

Вы можете сделать одну из вещей в зависимости от того, что вы хотите. Создайте локальную функцию.

(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))

В некоторых случаях (где у вас всегда один и тот же аргумент по умолчанию) вы можете перейти к логике, чтобы сделать это из своего кода, и поместить его в исходную функцию (или обернуть функцию в случае, если она находится в другой библиотеке).

(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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...