9

どうやら、レコード コンストラクターで apply を呼び出すことはできません。

(defrecord Foo. [id field])

(apply Foo. my-list)

Foo を想定していないため、読み取り時に失敗します。その場所で。

私が考えることができる唯一の明白な回避策は、ファクトリ関数を追加することでした:

(make-foo [id field] (Foo. id field))

もちろん適用できます。

何か不足していますか?これは C#/Java から期待できますが、Clojure では少しがっかりしたと思いました...

4

3 に答える 3

11

このポスト1.3に戻って....

Clojure 1.3 では、defrecord は 2 つの生成されたコンストラクター関数を作成します。与えられた:

(defrecord Person [first last]) 

これにより、位置コンストラクター関数が作成されます->Person

(->Person "alex" "miller")

およびマップ コンストラクター関数map->Person:

(map->Person {:first "string"})

これはマップであるため、すべてのキーはオプションであり、構築されたオブジェクトでは nil 値を取ります。

レコードを宣言する ns からこれらの関数を要求/使用する必要がありますが、Java クラス コンストラクターを使用する場合のようにレコード クラスをインポートする必要はありません。

詳細:

于 2012-01-21T19:13:17.373 に答える
6

Foo.は Java クラス コンストラクターであるため、呼び出し方に典型的な Java 相互運用性制約があります。コンストラクター関数を作成することは、一般的な解決策です (別の名前空間にあるときに Foo をインポートする必要がないことも意味します)。

于 2011-02-16T13:51:03.817 に答える
3

この問題は既知であり、Clojure メーリング リストで多くの話題があります。Clojure の将来のバージョンでは、おそらくさらに多くのサポートが追加されるでしょう。

今のところ、独自の関数を使用するか、次のような機能をサポートするhttps://github.com/david-mcneil/defrecord2を使用する必要があります。

  • 評価可能な形式で印刷する
  • コンストラクターとして clojure 関数を提供する
  • コンストラクターで名前付きパラメーター (マップ) を受け入れる
  • プレ/ポストウォークマルチメソッドに参加
于 2011-02-16T12:56:05.447 に答える