2013-02-10 44 views

回答

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對象是一個字節數組?」的確切頁面? ;)

+1

的「的forName」的部分是非常低效和實現相關的。尼爾斯克的回答更快更強勁。 – dimagog 2013-02-10 22:46:21

+0

@dimagog是對的。而不是編輯代碼,我只想指出''(Class/forName「[B」)'可以像'(def^{:private true} bytes-class(Class/forName「[B」 ))'。這是你在運行時支付var取消引用成本而不是反射成本。我不知道哪一個更糟。在這種情況下AFAIK'^:const'也不起作用。 – muhuk 2016-01-04 09:49:52

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的例子似乎簡單了很多,雖然,它似乎我還會有一些重構做,我用這個:)

+2

沒有答案是有權upvotes:人喜歡他們喜歡什麼。根據我的經驗,抱怨缺少選票會讓他們感到更加沮喪。 – amalloy 2013-02-10 20:54:20

+0

@NielsK我已經upvoted你的答案。不是因爲你的邀請,而是因爲它更好:-)。 – dimagog 2013-02-10 22:50:53

相關問題