是否可以为 Clojure 中的类型化 Java-Array 覆盖 .toString?

ren*_*_gr 1 overriding clojure clojure-java-interop

我有一个像这样的字节数组:

(def byte-arr (byte-array (map byte "This is a test"))) ; => #<byte[] [B@63465272>
Run Code Online (Sandbox Code Playgroud)

打电话时.toString我得到[B@1b96107b. 在这种情况下,是否可以覆盖.toStringclojure 类型的 -Method[BThis is a test代替?

Ale*_*art 5

全局假设所有字节数组都是可打印字符串是一个坏主意,因此只使用 String 构造函数的建议是正确的。也就是说,您可以按类型全局添加新打印。

打印功能最终会转移到调用任一方法print-method或多方法print-dup,这取决于是否*print-dup*为真。您可以print-method使用core_print.clj 中print-sequentialhelper 函数添加一个新方法,如下所示:

(in-ns 'clojure.core)

(def ^:private ByteArray (type (byte-array 0)))

(defmethod print-method ByteArray [ba ^Writer w]
  (print-sequential "[" pr-on " " "]" ba w))
Run Code Online (Sandbox Code Playgroud)

请注意,这只是打印一个字节数组,就好像它是一个字节向量:

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]
Run Code Online (Sandbox Code Playgroud)