5
(conj (drop-last "abcde") (last "abcde"))

戻り値(\e \a \b \c \d)

混乱しています。のドキュメントでconj、私は気づきました

「追加」は、具体的なタイプに応じて異なる「場所」で発生する可能性があります。

の場合LazySeq、新しい項目を追加する場所は頭であるということですか? 結果としてどのように取得でき(\a \b \c \d \e)ますか?

4

2 に答える 2

6

「「追加」は、具体的なタイプに応じて異なる「場所」で発生する可能性があり ます。

これは、パフォーマンスと基礎となる実装に関して最も効率的な方法で追加を組み込んだ Clojure の永続的なコレクションの動作を指します。

ベクトルは常にコレクションの最後に追加されます。

user=> (conj [1 2 3] 4)
[1 2 3 4]

お気づきのように、リストを使用すると、conj は項目をリストの先頭に置きます。

user=> (conj '(1 2 3) 4)
(4 1 2 3)

そうです、LazySeq は具体的な実装に関して List のように扱われます。

結果としてどのように取得でき(\a \b \c \d \e)ますか?

いくつかの方法がありますが、LazySeq から簡単にベクターを作成できます。

(conj (vec (drop-last "abcde"))
      (last "abcde"))
于 2012-07-15T10:13:47.120 に答える
1

Clojure の Javaのインターフェイスでconjの実装に委任するだけであることを理解することが重要です。したがって、処理される特定のデータ構造に応じて、動作が異なる場合があります。consIPersistentCollection

conj の背後にある意図は、常に最も効率的な方法で項目をデータ構造に追加することです。

リストの場合、それを配置する最も効率的な場所はフロントです。ベクトルの場合、配置する最も効率的な場所は末尾です。

于 2012-07-17T02:57:02.540 に答える