一時データ構造は、常に既存の永続的なClojureデータ構造から作成されます。Clojure 1.1.0以降、ベクトル、ハッシュマップ、ハッシュセットがサポートされています。すべてのClojureデータ構造がこの機能をサポートするわけではありませんが、ほとんどはサポートします。リストは、メリットがないためサポートされません。
`transient`関数を呼び出すことで、データ構造の一時的な「コピー」を取得します。これにより、ソースのコピーであり、同じパフォーマンス特性を持つ新しい一時データ構造が作成されます。実際、それはほとんどソースデータ構造そのものであり、一時データ構造の最初の機能、つまり作成がO(1)であることを強調しています。永続的なコピーと同様に、ソースと構造を共有します。
一時データ構造の2番目の機能は、作成がソースを変更せず、ソースは一時データ構造の使用によって変更できないことです。ソースデータは常に不変で永続的です。
一時データ構造は、ソースの読み取り専用インターフェースをサポートします。つまり、永続的なベクトルと同様に、`nth`、`get`、`count`を呼び出すことができ、一時ベクトルを関数呼び出しできます。
一時データ構造は、ソースデータ構造の永続的なインターフェースを**サポートしません**。`assoc`、`conj`などはすべて例外をスローします。なぜなら、一時データ構造は永続的ではないからです。したがって、永続的なデータ構造が必要なコンテキストに一時データ構造を誤って流出させることはできません。
一時データ構造は、類似した名前の後に`!`が付いた一連の「変更」操作をサポートします(`assoc!`、`conj!`など)。これらは、永続的な対応物と同じことを行いますが、戻り値はそれ自体が一時データ構造です。特に、一時データ構造は、その場で変更されるように設計されていないことに注意してください。次の呼び出しで戻り値を取得して使用する必要があります。このようにして、それらは、置き換える関数型永続コードと同じコード構造をサポートします。例で示すように、これにより、構造を変更することなく、コードのパフォーマンスを簡単に向上させることができます。
結果の構築が完了したら、`persistent!`関数を一時データ構造に呼び出すことで、永続的なデータ構造を作成できます。この操作もO(1)です。`persistent!`を呼び出した後、一時データ構造を使用しないでください。すべての操作は例外をスローします。これは、作成したエイリアスにも当てはまります。