Clojure でベクトルをテストしてネストされているかどうかを確認する方法、つまり [:a :b :c :d] と [[:a :b] [:c :d]] をテストする方法はありますか?
テストしてみた
(vector? [:a :b :c :d])
true
ただし、ネストされたベクトルにも当てはまります。
(vector? [[:a :b] [:c :d]])
true
Clojure でベクトルをテストしてネストされているかどうかを確認する方法、つまり [:a :b :c :d] と [[:a :b] [:c :d]] をテストする方法はありますか?
テストしてみた
(vector? [:a :b :c :d])
true
ただし、ネストされたベクトルにも当てはまります。
(vector? [[:a :b] [:c :d]])
true
vector?
true
引数がベクトル (implements ) の場合に返しますIPersistentVector
。 [:a :b :c :d]
はベクトルです。そうです[[:a :b] [:c :d]]
。vector?
したがって、それらのいずれかを呼び出すと、 が返されtrue
ます。
ここで、要素のいずれかがベクトルである場合、そのベクトルはネストされていると言えます。述語を使用some
してこれをテストできます。vector?
(defn nested-vector? [v]
(some vector? v))
これは特にベクトルをテストします。Sequential
ただし、任意のデータ構造に適用される、より一般的なアプローチを採用することもできます。
(defn nested? [coll]
(some sequential? coll))
それらのいずれかが連続しているかどうかを確認するのは近いようです:
user> (every? #(not (sequential? %)) [:a :b :c :d])
true
user> (every? #(not (sequential? %)) [:a :b :c :d [:e]])
false
Java 配列もチェックする必要があるかもしれませんが、すべての基本コレクションをシーケンスにすることができるためです。
(every? #(not (sequential? %)) [:a :b :c :d (into-array [1 2 3])])