> (conj [0] 1 2 3)
[0 1 2 3]
> (conj {:a "ei"} {:b "bi"})
{:b "bi", :a "ei"}
>
参照:ベクトルに作用するとき、1,2,3をその最後に配置します。 これは、次のように書いています:b "bi"の前に:map k-vのペア これはなぜですか? ありがとうベクトルとマップの間でclojure conjが異なる動作をする理由
> (conj [0] 1 2 3)
[0 1 2 3]
> (conj {:a "ei"} {:b "bi"})
{:b "bi", :a "ei"}
>
参照:ベクトルに作用するとき、1,2,3をその最後に配置します。 これは、次のように書いています:b "bi"の前に:map k-vのペア これはなぜですか? ありがとうベクトルとマップの間でclojure conjが異なる動作をする理由
多くのハッシュマップの実装と同様に、Clojure's hashed mapsはエントリを並べ替えず、挿入された順序を保持しません。これにより、より良いパフォーマンスが可能になります。
conjには、一般的な順序付けのセマンティクス(ベクトルなどのいくつかの具体的な型の順序付けセマンティクス)もありません。
あなたは、マップはconj
から一貫性のない動作を取得する限り行く必要はありません。
(conj [1] 2) ; [1 2]
(conj (list 1) 2) ; (2 1)
ハッシュマップは何のためを定義しています。しかし、いずれのマップのために、エントリの
seq
は常にvals
とkeys
が一貫順になりますしたがって、マップm
、
(= (keys m) (map key m))
(= (vals m) (map val m))
(= m (zipmap (keys m) (vals m)))
のために、このシーケンスは、挿入順序に依存しないように思えます。ランダムな整数を無作為に入れ替えて、これをテストしました。
Conjにはコンクリート型のセマンティクスがあります。言い換えれば、それは多相関数です。 –
[sorted-map](https://clojuredocs.org/clojure.core/sorted-map)は、キーでエントリを並べ替えるクロージャマップです。 – Mars
この多型はどこからも出てこないことに注意してください。これは、順序付けられるハッシュマップの目的ではありません。その目的は、別の意味を持つ値からアクセスすることです。 「参加」操作を実行する。注文は関係ありません。そうでなければ、ベクトルまたはソートマップがあります。 –