私は次のようなバイト配列を持っています:
(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
か?
私は次のようなバイト配列を持っています:
(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
か?
すべてのバイト配列が印刷可能な文字列であるとグローバルに想定するのは悪い考えです。したがって、String コンストラクターを使用するだけのアドバイスは正しいです。とはいえ、新しい印刷をタイプごとにグローバルに追加できます。
印刷関数は、 trueかどうかに応じて、最終的にいずれかprint-method
またはマルチメソッドの呼び出しに委ねられます。core_print.cljのヘルパー関数を使用して、次のように新しいメソッドを追加できます。print-dup
*print-dup*
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]
そのバイト配列を使用してStringオブジェクトを作成するだけです。
(println (String. byte-arr))
toString をオーバーライドすることはお勧めしません。グローバルな変更が多すぎるため、デフォルトの動作を中継するものを壊す可能性があります。
特定の要件に合わせて関数を作成してみませんか?