16

少なくともいくつかの引数に適用できる操作を表すという意味で、「関数のような」レコードがあるとします。

clojure.lang.IFn次のような実装を行うことで、関数として機能させることができます。

(defrecord Func [f x]
  clojure.lang.IFn
    (invoke [this arg]
      (f x arg))
    (applyTo [this args]
      (apply f x args)))

 ((->Func + 7) 1)
 => 8

(はい、私はちょうど劣ったバージョンのpartial...を再実装したことを知っています。それは単なる例です:-))

レコードを作成することclojure.lang.IFnは良い習慣ですか?

このアプローチの落とし穴はありますか?

4

2 に答える 2

6

まだ驚いています。レコードは「永続マップの完全な実装」であると想定されています。それで、あなたの質問に答えるために、私はそれが地図がそうであるように、そのキーの機能であると期待します。他の何かは非常に驚くべきことです。

于 2012-08-15T05:24:31.740 に答える
0

直接はい/いいえの答えを出すことはできませんが、私の経験を共有することはできます。

実装されたレコードを定義しましたclojure.lang.IFn。IFnの実装は、REPL環境で簡単にテストできるようにすることでした。

そのレコードは、ワーカーによって処理される予定のJobクラスであることが意図されていました。そのため、別のインターフェースjava.lang.Runnablerun関数も実装しました。

私が実際にコードを統合テストに入れたとき、それは例外を投げました。なんで?

ワーカーロジックは次のようなものでした。

  1. Jobクラスがインスタンスであるかどうかをチェックし、Callableインスタンスである場合は、関数を呼び出しcallます。
  2. Jobクラスがインスタンスであるかどうかをチェックし、Runnableインスタンスである場合は、関数を呼び出しrunます。

ただし、clojure.lang.IFnすでに拡張されているCallableため、関数Runnableの実装を忘れたために例外が発生しました。call

于 2021-02-18T06:46:55.197 に答える