64

のようなjava.lang.CharacterのLazySeqがあるとしましょう

(\b \ \! \/ \b \ \% \1 \9 \/ \. \i \% \$ \i \space \^@)

これを文字列に変換するにはどうすればよいですか? 私は明らかなことを試しました

(String. my-char-seq)

しかし、それは投げます

java.lang.IllegalArgumentException: No matching ctor found for class java.lang.String (NO_SOURCE_FILE:0)
[Thrown class clojure.lang.Compiler$CompilerException]

String コンストラクターがLazySeqの代わりにプリミティブchar[]を期待しているためだと思います。それで、私は次のようなことを試しました

(String. (into-array my-char-seq))

しかし、それは同じ例外をスローします。現在の問題は、into-arrayがプリミティブchar[ ] ではなくjava.lang.Character[]を返すことです。私は実際にこのような文字シーケンスを生成するので、これはイライラします

(map #(char (Integer. %)) seq-of-ascii-ints)

基本的に、ASCII 文字を表す int のシーケンスがあります。65 = A など。プリミティブ型強制関数(char x)を明示的に使用していることがわかります。

これが意味することは、マップ関数はプリミティブcharを返しているが、Clojureマップ関数は全体としてjava.lang.Characterオブジェクトを返しているということです。

4

3 に答える 3

128

これは機能します:

(apply str my-char-seq)

基本的に、strは各引数に対して toString() を呼び出し、それらを連結します。ここでは、applyを使用して、シーケンス内の文字を引数としてstrに渡しています。

于 2009-11-06T14:30:41.290 に答える