Wie würde man die Funktion bytes?
schreiben, das die folgenden zurück:Wie überprüft man, ob ein Clojure-Objekt ein Byte-Array ist?
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
Wie würde man die Funktion bytes?
schreiben, das die folgenden zurück:Wie überprüft man, ob ein Clojure-Objekt ein Byte-Array ist?
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
(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?" ;)
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 :)
unter der Rubrik ‚forName‘ ist sehr ineffizient und Implementierung abhängig. Nielsk antwortet schneller und robuster. – dimagog
@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