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(Do What I Mean),Java 8为这种便利在接口上提供了默认实现。

0
已回答
参考: https://clojure.atlassian.net/browse/CLJ-1563(由ale softball+import报告)
...