Что не так со следующим протоколом Clojure? - PullRequest
20 голосов
/ 04 февраля 2011

В 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 Ответ

33 голосов
/ 04 февраля 2011

Я думаю, что второй 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
...