Clojurenil?
では nil をチェックします。nilではないことをどのようにチェックしますか?
次の Java コードに相当する Clojure を実行したいと考えています。
if (value1==null && value2!=null) {
}
フォローアップ:でラップするのではなく、nil 以外のチェックを期待していましたnot
。相手if
を持っています。if-not
に対応するものはありnil?
ますか?
Clojurenil?
では nil をチェックします。nilではないことをどのようにチェックしますか?
次の Java コードに相当する Clojure を実行したいと考えています。
if (value1==null && value2!=null) {
}
フォローアップ:でラップするのではなく、nil 以外のチェックを期待していましたnot
。相手if
を持っています。if-not
に対応するものはありnil?
ますか?
Clojure 1.6 以降では、以下を使用できますsome?
。
(some? :foo) => true
(some? nil) => false
これは、たとえば述語として役立ちます。
(filter some? [1 nil 2]) => (1 2)
と区別false
したくない場合nil
は、値を条件として使用できます。
(if value1
"value1 is neither nil nor false"
"value1 is nil or false")
Clojure では、条件式の目的で nil は false としてカウントされます。
結果として、(not x)
works は実際に(nil? x)
はほとんどの場合とまったく同じように機能します (ブール値の false を除いて)。例えば
(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))
...
...)
調子:(and (nil? value1) (not (nil? value2)))
if条件:(if (and (nil? value1) (not (nil? value2))) 'something)
EDIT:Charles Duffyは、次の正しいカスタム定義を提供しますnot-nil?
:
非 nil が必要ですか? 簡単にできます:
(def not-nil? (comp not nil?))
true
指定されたときにテストを返したい場合false
は、ここで他の回答のいずれかが必要です。nil
しかし、または以外の何かが渡されたときに常に真の値を返すことをテストしたいだけの場合はfalse
、 を使用できますidentity
。たとえば、シーケンスからnil
s (またはs) を削除するには:false
(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 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
関数が必要な場合はnot-nil?
、次のように定義することをお勧めします。
(defn not-nil?
(^boolean [x]
(not (nil? x)))
これの使用法を明白な代替案と比較する価値があると言った:
(not (nil? x))
(not-nil? x)
2文字/1レベルのネストを節約するために、追加の非標準関数を導入する価値があるかどうかはわかりません。高階関数などで使用したい場合は、それは理にかなっています。