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

如何检查clojure对象是否为字节数组?,clojure,Clojure,如何编写返回以下内容的函数字节?: (bytes? [1 2 3]) ;; => false (bytes? (byte-array 8)) ;; => true 更新。这里已经提出了相同的问题。谷歌在你的问题“如何检查clojure对象是否是字节数组?”上给出了确切的答案 到目前为止,我一直使用的方法是创建该类型的数组并测试其类。为了防止每次都创建不必要的实例,请创建一个关闭该特定数组类型的类的函数 (defn test-array [t] (let [check (ty

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

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

更新。这里已经提出了相同的问题。谷歌在你的问题“如何检查clojure对象是否是字节数组?”上给出了确切的答案

到目前为止,我一直使用的方法是创建该类型的数组并测试其类。为了防止每次都创建不必要的实例,请创建一个关闭该特定数组类型的类的函数

(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的例子似乎简单多了,而且似乎在我使用的地方我还需要进行一些重构:)

Clojure.core 1.9版以后的版本支持
字节?
函数。这是一个

没有人有权投票的答案:人们喜欢他们喜欢的东西。根据我的经验,抱怨选票不足更让他们泄气。@NielsK我对你的答案投了更高的票。不是因为你的请求,而是因为它更好:-)“forName”部分效率很低,而且依赖于实现。尼尔斯克的答案更快、更有力。@dimagog是对的。与其编辑代码,我只想指出
(Class/forName“[B”)
可以移动到类似
(def^{:private true}bytes类(Class/forName“[B”)的变量中
。这是您在运行时支付的var解引用成本,而不是反射成本。我不知道哪一个更糟糕。另外,在这种情况下,AFAIK
^:const
不起作用。
(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