一個怎樣編寫返回以下功能bytes?
:如何檢查clojure對象是否是字節數組?
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
一個怎樣編寫返回以下功能bytes?
:如何檢查clojure對象是否是字節數組?
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
(defn bytes? [x]
(if (nil? x)
false
(= (Class/forName "[B")
(.getClass x))))
更新。這裏已經提出了同樣的問題Testing whether an object is a Java primitive array in Clojure。和谷歌給你的問題,「如何檢查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的例子似乎簡單了很多,雖然,它似乎我還會有一些重構做,我用這個:)
的「的forName」的部分是非常低效和實現相關的。尼爾斯克的回答更快更強勁。 – dimagog 2013-02-10 22:46:21
@dimagog是對的。而不是編輯代碼,我只想指出''(Class/forName「[B」)'可以像'(def^{:private true} bytes-class(Class/forName「[B」 ))'。這是你在運行時支付var取消引用成本而不是反射成本。我不知道哪一個更糟。在這種情況下AFAIK'^:const'也不起作用。 – muhuk 2016-01-04 09:49:52