以下的Clojure协议有什么问题?

20

在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的实例。

1个回答

34

我认为你协议中的第二个foo正在覆盖第一个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

谢谢!非常有意思,我没有意识到可以这样覆盖定义......感觉有点难以捉摸! - mikera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接