【问题标题】:What's wrong with the following Clojure protocol?以下 Clojure 协议有什么问题?
【发布时间】:2011-02-03 22:53:56
【问题描述】:

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

【问题讨论】:

    标签: clojure protocols


    【解决方案1】:

    我认为您的协议中的第二个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
    

    【讨论】:

    • 谢谢!非常有趣,我没有意识到可以以这种方式覆盖定义......似乎有点偷偷摸摸!
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多