Подтвердить что ты не робот

Clojure not nil check

В Clojure nil? проверяется значение nil. Как проверить не ноль?

Я хочу сделать эквивалент Clojure следующего кода Java:

if (value1==null && value2!=null) {
}

Последующее наблюдение: Я надеялся на проверку не ноль, а не на not. if имеет аналог if-not. Существует ли такой аналог для nil??

4b9b3361

Ответ 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)

Я не уверен, что введение дополнительной нестандартной функции стоит того, чтобы сохранить два символа/один уровень вложенности. Это имело бы смысл, если бы вы хотели использовать его в функциях более высокого порядка и т.д.