请在2024 Clojure 状态调查中分享您的想法!

欢迎!有关如何使用此网站的更多详细信息,请参阅关于页面。

0
Clojure

考虑以下示例

`
user=> (defprotocol Foo (foo [x] x))
Foo
user=> (defrecord Bar [gaz waka] Foo)
user.Bar
user=> (def bar (Bar. 1 2))

'user/bar

user=> (.foo bar)

AbstractMethodError user.Bar.foo()Ljava/lang/Object; sun.reflect.NativeMethodAccessorImpl.invoke0 (NativeMethodAccessorImpl.java:-2)
user=>
`

默认实现怎么办。

4 个答案

0

评论者:mobiusinversion

正如目前所做的那样,您必须使用以下方式处理这个情况

http://stackoverflow.com/questions/15039431/clojure-mix-protocol-default-implementation-with-custom-implementation

0

评论者:wagjo

我认为我们不需要它。在扩展某些协议、不实现其方法然后调用这些方法并期望它们不会抛出异常背后是什么推理?请明确您的类型应该执行什么,是默认行为还是自定义行为。基本上,您有三种选择:

`
(defn default-foo
[this]
:foo)

(defprotocol P
(-foo [this]))

(deftype T
P
(-foo [this] (default-foo))

(defn foo
[x]
(-foo x))
`

或者

`
(defprotocol P
(-foo [this]))

(deftype T)

(defn foo
[x]
(if (satisfies? P x)

(-foo x)
:foo))

`

或者

`
(defprotocol P
(-foo [this]))

(extend-protocol P
java.lang.Object
(-foo [this] :foo))

(deftype T)

(defn foo
[x]
(-foo x))
`

然而,我认为我的第一种方法是不合语法的,您应该选择后者。

0
by

评论者:mobiusinversion

我同意,这是一个低优先级的功能升级。我认为这可以使协议体验更加DWIMy,并且Java 8在接口上提供了默认实现以提高此类便利性。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1563(由 alex+import 报告)
...