1

私は次のようなバイト配列を持っています:

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

電話する.toString[B@1b96107b. .toStringその場合、代わりにclojure タイプの -Method をオーバーライドして get することは可能[BですThis is a testか?

4

3 に答える 3

5

すべてのバイト配列が印刷可能な文字列であるとグローバルに想定するのは悪い考えです。したがって、String コンストラクターを使用するだけのアドバイスは正しいです。とはいえ、新しい印刷をタイプごとにグローバルに追加できます。

印刷関数は、 trueかどうかに応じて、最終的にいずれかprint-methodまたはマルチメソッドの呼び出しに委ねられます。core_print.cljのヘルパー関数を使用して、次のように新しいメソッドを追加できます。print-dup*print-dup*print-methodprint-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]
于 2013-12-17T14:06:46.897 に答える
2

そのバイト配列を使用してStringオブジェクトを作成するだけです。

(println (String. byte-arr))
于 2013-12-17T11:21:20.943 に答える
2

toString をオーバーライドすることはお勧めしません。グローバルな変更が多すぎるため、デフォルトの動作を中継するものを壊す可能性があります。

特定の要件に合わせて関数を作成してみませんか?

于 2013-12-17T10:34:28.247 に答える