Clojure not nil check
В Clojure nil?
проверяется значение nil. Как проверить не ноль?
Я хочу сделать эквивалент Clojure следующего кода Java:
if (value1==null && value2!=null) {
}
Последующее наблюдение: Я надеялся на проверку не ноль, а не на not
. if
имеет аналог if-not
. Существует ли такой аналог для nil?
?
Ответы
Ответ 1
Другим способом определения not-nil?
будет использование функции complement
, которая просто инвертирует правдоподобие логической функции:
(def not-nil? (complement nil?))
Если у вас есть несколько значений для проверки, используйте not-any?
:
user> (not-any? nil? [true 1 '()])
true
user> (not-any? nil? [true 1 nil])
false
Ответ 2
После Clojure 1.6 вы можете использовать some?
:
(some? :foo) => true
(some? nil) => false
Это полезно, например, как предикат:
(filter some? [1 nil 2]) => (1 2)
Ответ 3
Если вам не интересно различать false
от nil
, вы можете просто использовать это значение как условие:
(if value1
"value1 is neither nil nor false"
"value1 is nil or false")
Ответ 4
В Clojure, nil считается ложным для условных выражений.
В результате (not x)
фактически работает точно так же, как (nil? x)
в большинстве случаев (за исключением логического ложного). например.
(not "foostring")
=> false
(not nil)
=> true
(not false) ;; false is the only non-nil value that will return true
=> true
Итак, чтобы ответить на ваш первоначальный вопрос, вы можете просто сделать:
(if (and value1 (not value2))
...
...)
Ответ 5
условие: (and (nil? value1) (not (nil? value2)))
if-condition: (if (and (nil? value1) (not (nil? value2))) 'something)
EDIT:
Чарльз Даффи дает правильное пользовательское определение для not-nil?
:
Вы хотите не-ноль? Легко сделано: (def not-nil? (comp not nil?))
Ответ 6
Вы можете попробовать когда-не:
user> (when-not nil (println "hello world"))
=>hello world
=>nil
user> (when-not false (println "hello world"))
=>hello world
=>nil
user> (when-not true (println "hello world"))
=>nil
user> (def value1 nil)
user> (def value2 "somevalue")
user> (when-not value1 (if value2 (println "hello world")))
=>hello world
=>nil
user> (when-not value2 (if value1 (println "hello world")))
=>nil
Ответ 7
Если вы хотите, чтобы ваш тест возвращал true
, если задан false
, вам нужен один из других ответов. Но если вы просто хотите проверить, что возвращает правдивое значение всякий раз, когда оно передавало что-то другое, кроме nil
или false
, вы можете использовать identity
. Например, чтобы вырезать nil
(или false
s) из последовательности:
(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
Ответ 8
Если вы хотите использовать функцию not-nil?
, я бы предложил просто определить ее следующим образом:
(defn not-nil?
(^boolean [x]
(not (nil? x)))
Сказав, что стоит сравнить использование этого с очевидной альтернативой:
(not (nil? x))
(not-nil? x)
Я не уверен, что введение дополнительной нестандартной функции стоит того, чтобы сохранить два символа/один уровень вложенности. Это имело бы смысл, если бы вы хотели использовать его в функциях более высокого порядка и т.д.