54 votes

Comment convertir une LazySeq de caractères en String en Clojure ?

Disons que j'ai un LazySeq de java.lang.Character comme

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

Comment puis-je le convertir en une chaîne de caractères ? J'ai essayé les méthodes évidentes

(String. my-char-seq)

mais il jette

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

Je pense que parce que le constructeur String attend une primitive char[] au lieu d'un LazySeq . Alors j'ai essayé quelque chose comme

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

mais il jette la même exception. Le problème maintenant est que en réseau renvoie un java.lang.Character[] au lieu d'une primitive char[] . C'est frustrant, car je génère en fait ma séquence de caractères comme ceci

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

En gros, j'ai une série d'ints représentant des caractères ASCII ; 65 = A, etc. Vous pouvez voir que j'utilise explicitement la fonction de coercition de type primitif (char x) .

Ce que cela signifie, c'est que mon carte renvoie une fonction primitive char mais le Clojure carte La fonction globale renvoie le java.lang.Character objet.

108voto

Siddhartha Reddy Points 3555

Ça marche :

(apply str my-char-seq)

En gros, str appelle toString() sur chacun de ses arguments et les concatène ensuite. Ici, nous utilisons appliquer pour passer les caractères de la séquence en tant qu'arguments à str .

11voto

Alan Thompson Points 325

Une autre façon est d'utiliser clojure.string/join comme suit :

(require '[clojure.string :as str] )
(assert (= (vec "abcd")                [\a \b \c \d] ))
(assert (= (str/join  (vec "abcd"))    "abcd" ))
(assert (= (apply str (vec "abcd"))    "abcd" ))

Il existe une autre forme de clojure.string/join qui accepte un séparateur. Voir :

http://clojuredocs.org/clojure_core/clojure.string/join

-6voto

Carl Smotricz Points 36400

Pour transformer une séquence de caractères en une chaîne, l'idiome est le suivant

(str coll)

Si ces caractères sont sous la forme d'Ints ou autres, vous devrez d'abord les convertir, probablement par mappage :

(str (map char coll))

Non testé, malheureusement ; je n'ai pas de REPL sous la main.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X