以下Clojure协议有什么问题?

时间:2011-02-03 22:53:57

标签: clojure protocols

在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

我哪里错了?我希望看到1作为foo函数的单参数版本的结果,因为“你好!”显然是java.lang.Object的一个实例。

1 个答案:

答案 0 :(得分:33)

我认为你协议中的第二个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 。 arity上的重载与您使用的语法略有不同。

{{1}}