63

Clojurenil?では nil をチェックします。nilではないことをどのようにチェックしますか?

次の Java コードに相当する Clojure を実行したいと考えています。

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

フォローアップ:でラップするのではなく、nil 以外のチェックを期待していましたnot。相手ifを持っています。if-notに対応するものはありnil?ますか?

4

9 に答える 9

94

Clojure 1.6 以降では、以下を使用できますsome?

(some? :foo) => true
(some? nil) => false

これは、たとえば述語として役立ちます。

(filter some? [1 nil 2]) => (1 2)
于 2014-06-04T17:05:45.760 に答える
19

と区別falseしたくない場合nilは、値を条件として使用できます。

(if value1
   "value1 is neither nil nor false"
   "value1 is nil or false")
于 2012-08-08T03:11:34.907 に答える
18

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)) 
   ... 
   ...)
于 2012-08-10T03:21:55.957 に答える
7

調子:(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?))

于 2012-08-07T21:31:01.587 に答える
6

true指定されたときにテストを返したい場合falseは、ここで他の回答のいずれかが必要です。nilしかし、または以外の何かが渡されたときに常に真の値を返すことをテストしたいだけの場合はfalse、 を使用できますidentity。たとえば、シーケンスからnils (またはs) を削除するには:false

(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
于 2014-03-13T14:51:51.810 に答える
4

あなたはいつでも試すことができます-ではありません

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
于 2012-11-29T12:48:18.110 に答える
2

関数が必要な場合はnot-nil?、次のように定義することをお勧めします。

(defn not-nil? 
  (^boolean [x]
    (not (nil? x)))

これの使用法を明白な代替案と比較する価値があると言った:

(not (nil? x))
(not-nil? x)

2文字/1レベルのネストを節約するために、追加の非標準関数を導入する価値があるかどうかはわかりません。高階関数などで使用したい場合は、それは理にかなっています。

于 2012-08-08T05:09:34.580 に答える