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

时间:2013-12-17 10:24:47

标签: clojure override clojure-java-interop

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

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

致电.toString时,我得到[B@1b96107b。在这种情况下,是否可以覆盖.toString - clojure类型[B的方法来获取This is a test

3 个答案:

答案 0 :(得分:4)

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

打印功能最终会转移到print-methodprint-dup多方法的调用,具体取决于*print-dup*是否为真。您可以使用core_print.clj中的print-method辅助函数向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]

答案 1 :(得分:2)

我不建议覆盖toString。这是太多的全局变化,你可能会破坏一些继承默认行为的东西。

为什么不为您的特定要求创建功能?

答案 2 :(得分:2)

使用该字节数组的construct a String对象:

(println (String. byte-arr))