如何检查clojure对象是否是字节数组?

时间:2013-02-10 10:54:38

标签: clojure

如何编写返回以下内容的函数bytes?

(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true

3 个答案:

答案 0 :(得分:12)

我以前用这种方式做的就是创建一个这种类型的数组并测试它的类。为了防止每次都创建一个不必要的实例,请创建一个关闭该特定数组类型的类的函数。

(defn test-array
  [t]
  (let [check (type (t []))]
    (fn [arg] (instance? check arg))))

(def byte-array?
  (test-array byte-array))

=> (byte-array? (byte-array 8))
true

=> (byte-array? [1 2 3])
false

Mobyte的例子似乎更简单了,似乎我会在我使用它的地方进行一些重构:)

答案 1 :(得分:10)

(defn bytes? [x]
  (if (nil? x)
    false
    (= (Class/forName "[B")
       (.getClass x))))

更新。此处已经提出同样的问题Testing whether an object is a Java primitive array in Clojure。并且谷歌在你的问题上给出了那个页面“如何检查一个clojure对象是否是一个字节数组?” ;)

答案 2 :(得分:1)

Clojure.core 1.9及更高版本支持bytes?函数。这是Clojuredocs link