2011-02-03 65 views
20

在Clojure中1.2:以下Clojure協議有什麼問題?

(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 

我要去哪裏錯了?我希望看到1作爲foo函數的單參數版本的結果,因爲「你好!」顯然是java.lang.Object的一個實例。

回答

33

我認爲協議中的第二個foo正在破壞第一個。 arity上的重載與您使用的語法略有不同。

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 2011-02-11 00:31:54