私は Clojure プログラムで多くのマップと構造体を使用しています。これらを defrecords に変換すると、パフォーマンス以外にどのような利点がありますか?
ベストアンサー1
構造体は事実上非推奨であると考えているため、まったく使用しません。
多くのマップ インスタンスで使用される既知のキーの固定セットがある場合、通常はレコードを作成します。大きな利点は次のとおりです。
- パフォーマンス
- 生成されたクラスには、マルチメソッドやその他の状況で切り替えることができる型があります
- defrecordの周りの追加のマクロ機構により、フィールド検証、デフォルト値、その他必要なものを取得できます。
- レコードは任意のインターフェースやプロトコルを実装できる(マップはできない)
- 記録はほとんどの目的において地図として機能する
- キーと値は安定した(作成ごとの)順序で結果を返します
レコードの欠点:
- レコードは Java クラス インスタンス (Clojure マップではない) であるため、構造の共有はなく、同じレコード構造は、変更された同等のマップ構造よりも多くのメモリを使用する可能性があります。また、レコードを「変更」すると、オブジェクトの作成/破棄も増えますが、JVM は、このような短命のガベージを難なく処理するように特別に設計されています。
- 開発中にレコードを変更する場合は、その変更を反映するために REPL をより頻繁に再起動する必要がある可能性があります。これは通常、開発のごく一部でのみ問題になります。
- 既存のライブラリの多くは、レコード (postwalk、zip、matchure など) をサポートするように更新されていません。必要に応じてこのサポートを追加しました。