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

评论者:mobiusinversion

我同意,这是一个低优先级的增强功能。我认为它可以使协议体验更加符合直觉(DWIMy),Java 8 为接口提供了默认实现,以便提供同样的便利性。

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