我有一個字節數組,像這樣:是否有可能覆蓋Clojure中的類型化Java數組的.toString?
(def byte-arr (byte-array (map byte "This is a test"))) ; => #<byte[] [[email protected]>
當調用.toString
我得到[[email protected]
。是否可以重寫.toString
- clojure類型[B
的方法以獲得This is a test
而不是在那種情況下?
我有一個字節數組,像這樣:是否有可能覆蓋Clojure中的類型化Java數組的.toString?
(def byte-arr (byte-array (map byte "This is a test"))) ; => #<byte[] [[email protected]>
當調用.toString
我得到[[email protected]
。是否可以重寫.toString
- clojure類型[B
的方法以獲得This is a test
而不是在那種情況下?
這是一個壞主意,在全球範圍承擔所有字節數組是一個可打印的字符串,因此建議只使用String構造是正確的。也就是說,你可以按類型在全球範圍內添加新的打印。
根據*print-dup*
是否爲true,打印功能最終會轉移到print-method
或print-dup
多種方法的調用。您可以添加一個新的方法print-method
使用core_print.clj的print-sequential
輔助函數如下:
(in-ns 'clojure.core)
(def ^:private ByteArray (type (byte-array 0)))
(defmethod print-method ByteArray [ba ^Writer w]
(print-sequential "[" pr-on " " "]" ba w))
注意這只是打印一個字節數組,就好像它是個字節的向量:
clojure.core=> (in-ns 'user)
#<Namespace user>
user=> (byte-array (map byte "This is a test"))
[84 104 105 115 32 105 115 32 97 32 116 101 115 116]
我不推薦重寫toString。這是太多的全球變化,你可能會打破一些繼承了默認行爲的東西。
爲什麼不根據您的特定要求創建函數?
只需construct a String對象與字節數組:
(println (String. byte-arr))
我從來沒有嘗試過reify(我也不能說我完全理解它是如何工作的,或者我會在哪裏使用atm)。但是,是否有可能使用reify作爲該用例? –
當需要某個接口,協議和/或對象的一次實例時,「reify」是合適的。如果可以將它用於Java的原始數組,那麼'proxy'將會更適合,但從我的經驗和我嘗試過的東西來看,似乎並不是這樣。 @AlexTaggart解決方案似乎對我來說是最好的。 –
謝謝澄清! –