3

Clojure を使用すると、次のようになります。

(defprotocol Greeter (hello [args] "Say hello"))

(extend-protocol Greeter
   String
   (hello [this] (str "Hello " this)))

(hello "world")    ; "Hello world"

ここまでは順調ですね。次に、次を追加します。

(defn hello [args] (str "Wassup " args "?"))

前のフォームの出力を次のように変更します。

(hello "world")    ; "Wassup world?"

機能よりもプロトコルを優先させる方法はありますか?

4

2 に答える 2

5

メソッドよりもプロトコルを優先させる方法はありますか?

defnとはメッシュできませんdefprotocol。これはdefprotocol、現在の名前空間で実際に関数のバインディングを生成するためです。この順序でコードを実行すると、警告が表示されることに注意してください。

user=> (defn hello [args] (str "Wassup " args "?"))
#'user/hello
user=> (defprotocol Greeter (hello [args] "Say hello"))
Warning: protocol #'user/Greeter is overwriting function hello
Greeter

プロトコルのドキュメントでは、デフォルトの実装を提供する正しい方法は次を使用することであると説明されていますObject

(defprotocol Greeter (hello [args] "Say hello"))

(extend-protocol Greeter
   Object
   (hello [this] (str "Wassup " this "?")))

(extend-protocol Greeter
   String
   (hello [this] (str "Hello " this)))

(hello "world")    ; "Hello world"

(hello 1)    ; "Wassup 1?"
于 2013-04-12T16:36:11.830 に答える