6

オプションの引数を取る関数を自分の型に入れたいです。タイプに属さない関数でオプションの引数を正常に使用できましたが、プロトコルとタイプ内で機能させることができないようです。

私の失敗したトライアル:

Clojure 1.4.0
user=> (defprotocol OptArg
(func [this a & b]))
OptArg

user=> (deftype Imp [] OptArg
(func [this a & b] (println a b)))
user.Imp

user=> (func (Imp.) 1 2)
CompilerException java.lang.IllegalArgumentException: No single method: func of interface: user.OptArg found for function: func of protocol: OptArg, compiling:(NO_SOURCE_PATH:5) 

user=> (defn opt-arg [a & b] (println a b))
#'user/opt-arg

user=> (opt-arg 1 2)
1 (2)
nil
user=> (opt-arg 1)
1 nil
nil
user=>
4

2 に答える 2

8

ここで回答したように、プロトコルは可変引数をサポートしていません。必要な数の引数ごとに個別のメソッドを定義するか、単にリストを引数として受け入れる必要があります。

于 2012-05-16T06:46:57.267 に答える
2

defprotocol+オプションの引数を使用してプロトコルを定義するための を作成しました。アイデアは& args、プロトコルの固定引数として作成し、ラッパー関数を自動的に作成することです。

マクロについては、この要点を確認してください。

使用法

(defprotocol+IPipeline
  (run-and-wait [this & args]))

(defrecord+ パイプライン []
  IP パイプライン
  (実行と待機 [this & args]
    )))

(実行待機 (パイプライン) 1 2 3 4 5)

于 2014-09-22T05:45:11.730 に答える