Clojure에서 LazySeq 문자를 문자열로 어떻게 변환 할 수 있습니까?
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))
그러나 동일한 예외가 발생합니다. 이제 문제 는 in -array 가 원시 char [] 대신 java.lang.Character [] 를 반환한다는 것입니다 . 실제로 이런 캐릭터 시퀀스를 생성하기 때문에 답답합니다.
(map #(char (Integer. %)) seq-of-ascii-ints)
기본적으로 ASCII 문자를 나타내는 일련의 정수가 있습니다. 65 = A 등. 내가 명시 적으로 원시 유형 강제 변환 함수 (char x)를 사용하는 것을 볼 수 있습니다 .
이것이 의미하는 바는 내지 도 함수가 기본 문자를 반환 하지만 Clojure 지도 함수가 전체적으로 java.lang.Character 객체를 반환한다는 것입니다.
이것은 작동합니다 :
(apply str my-char-seq)
기본적으로 str 은 각 인수에 대해 toString ()을 호출 한 다음 연결합니다. 여기서 우리는 apply 를 사용 하여 시퀀스의 문자를 args로 str 에 전달합니다 .
또 다른 방법은 clojure.string/join
다음과 같이 를 사용 하는 것입니다.
(require '[clojure.string :as str] )
(assert (= (vec "abcd") [\a \b \c \d] ))
(assert (= (str/join (vec "abcd")) "abcd" ))
(assert (= (apply str (vec "abcd")) "abcd" ))
clojure.string/join
구분 기호를 허용 하는 대체 형식이 있습니다. 보다:
http://clojuredocs.org/clojure_core/clojure.string/join
더 복잡한 문제의 strcat
경우 Tupelo 라이브러리에서 찾아 볼 수도 있습니다 .
(require '[tupelo.core :as t] )
(prn (t/strcat "I " [ \h \a nil \v [\e \space (byte-array [97])
[ nil 32 "complicated" (Math/pow 2 5) '( "str" nil "ing") ]]] ))
;=> "I have a complicated string"
특별한 경우, 문제가되는 시퀀스의 기본 유형이있는 경우 다음 clojure.lang.StringSeq
을 수행 할 수도 있습니다.
(.s (my-seq))
clojure StringSeq 클래스에서 공개 최종 CharSequence 필드를 꺼내기 때문에 매우 성능이 뛰어납니다.
예:
(type (seq "foo"))
=> clojure.lang.StringSeq
(.s (seq "foo"))
=> "foo"
(type (.s (seq "foo")))
=> java.lang.String
타이밍 영향의 예 (유형 힌트를 사용할 때의 차이점에 유의) :
(time
(let [q (seq "xxxxxxxxxxxxxxxxxxxx")]
(dotimes [_ 1000000]
(apply str q))))
"Elapsed time: 620.943971 msecs"
=> nil
(time
(let [q (seq "xxxxxxxxxxxxxxxxxxxx")]
(dotimes [_ 1000000]
(.s q))))
"Elapsed time: 1232.119319 msecs"
=> nil
(time
(let [^StringSeq q (seq "xxxxxxxxxxxxxxxxxxxx")]
(dotimes [_ 1000000]
(.s q))))
"Elapsed time: 3.339613 msecs"
=> nil
'development' 카테고리의 다른 글
레이블이있는 경우에도 "시스템에서 지정된 배치 레이블을 찾을 수 없습니다"가 발생하는 이유는 무엇입니까? (0) | 2021.01.10 |
---|---|
남은 시간 계산 (0) | 2021.01.10 |
정적 변수에 대한 extern 링크가없는 이유는 무엇입니까? (0) | 2021.01.10 |
특정 길이의 단어와 일치하는 정규식 (0) | 2021.01.10 |
knockout.js에 조건부로 요소 속성 추가 (0) | 2021.01.10 |