2013-02-10 2 views

Antwort

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

aktualisieren. Die gleiche Frage wurde bereits hier gestellt Testing whether an object is a Java primitive array in Clojure. Und Google gibt genau diese Seite auf Ihre Frage, "wie man überprüft, ob ein clojure-Objekt ein Byte-Array ist?" ;)

+1

unter der Rubrik ‚forName‘ ist sehr ineffizient und Implementierung abhängig. Nielsk antwortet schneller und robuster. – dimagog

+0

@dimagog hat Recht. Anstatt den Code zu editieren, möchte ich nur anmerken, dass '(Class/forName" [B ")' in eine Variable wie '(def^{: private true} bytes-class (Klasse/forName" [B ")) '. Dies ist der Fall, in dem Sie die VAR-Dereferenzierungskosten statt der Reflektionskosten zur Laufzeit bezahlen. Ich weiß nicht, welcher schlechter ist. Auch AFAIK '^: const' funktioniert in diesem Fall nicht. – muhuk

12

Die Art, wie ich das bis jetzt gemacht habe, war ein Array dieses Typs zu erstellen und auf seine Klasse zu testen. Um zu verhindern, dass jedes Mal eine unnötige Instanz erstellt wird, erstellen Sie eine Funktion, die die Klasse dieses bestimmten Array-Typs schließt.

(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 dem Beispiel scheint eine Menge obwohl einfacher, und es scheint, ich werde einige Refactoring zu tun haben, wo ich diese :)

+2

Keine Antwort ist berechtigt zu upvotes: Leute mögen, was sie mögen. Meiner Erfahrung nach meckert das Klagen über fehlende Stimmen noch mehr. – amalloy

+0

@NielsK Ich habe Ihre Antwort geändert. Nicht wegen Ihrer Werbung, aber weil es besser ist :-). – dimagog

Verwandte Themen