2013-02-10 10 views

risposta

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

Update. La stessa domanda è già stata posta qui Testing whether an object is a Java primitive array in Clojure. E google dà esattamente quella pagina sulla tua domanda "come verificare se un oggetto clojure è un array di byte?" ;)

+1

parte la 'forName' è molto inefficiente e l'implementazione-dipendente. La risposta di Nielsk è più veloce e più robusta. – dimagog

+0

@dimagog ha ragione. Invece di modificare il codice vorrei solo notare che '(Class/forName" [B ")' può essere spostato in una var come '(def^{: private true} bytes-class (Class/forName" [B ")) '. Si trattava di pagare costi di dereferenziazione delle variabili piuttosto che costi di riflessione in fase di esecuzione. Non so quale sia peggio. Anche AFAIK '^: const' non funziona in questo caso. – muhuk

12

Il modo in cui lo facevo fino ad ora era la creazione di un array di quel tipo e il test per la sua classe. Per evitare ogni volta che si crea un'istanza non necessaria, creare una funzione che si chiuda sulla classe di quel particolare tipo di matrice.

(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 

esempio di Mobyte sembra molto più semplice, però, e sembra che dovrò un po 'di refactoring per fare in cui ho usato questo :)

+2

Nessuna risposta ha diritto a upvotes: alle persone piace quello che piace. Nella mia esperienza, lamentarsi della mancanza di voti li scoraggia ancora di più. – amalloy

+0

@NielsK Ho messo in circolazione la tua risposta. Non per la tua sollecitazione, ma perché è meglio :-). – dimagog

Problemi correlati