2011-02-03 7 views
20

次のClojureプロトコルで何が問題になっていますか? Clojureは1.2で

私は間違っているつもりです
(defprotocol PP 
    (foo [bar]) 
    (foo [bar baz])) 
=> PP 

(extend-protocol PP 
    Object 
    (foo [bar] 1) 
    (foo [bar baz] 2)) 
=> nil 

(foo "hello!") 
=> #<CompilerException java.lang.IllegalArgumentException: No single method: foo of interface: PP found for function: foo of protocol: PP 

?私はfoo関数の単一引数バージョンからの結果として1を見ることが期待されます。これは "hello!"明らかにjava.lang.Objectのインスタンスです。

答えて

33

あなたのプロトコルの第2のfooが最初のものを壊すと思います。アリティのオーバーロードは、使用している構文とは少し異なる構文をしています。

user> (defprotocol PP 
     (foo [bar] [bar baz])) 
PP 
user> (extend-protocol PP 
     Object 
     (foo 
      ([bar] 1) 
      ([bar baz] 2))) 
nil 
user> (foo "foo") 
1 
user> (foo "foo" "bar") 
2 
+0

ありがとうございました!非常に興味深いですが、私はこのように定義を上書きすることが可能であることに気づいていませんでした。ちょっとした雑感のようですね! – mikera

関連する問題