gpt4 book ai didi

clojure - 为什么 clojure 协议(protocol)方法经常被函数包装?

转载 作者:行者123 更新时间:2023-12-03 21:30:45 25 4
gpt4 key购买 nike

通常,当我在库中看到 clojure 协议(protocol)时,协议(protocol)方法将被包装在一个函数中,通常几乎没有添加功能。例如。:

(defprotocol Pfoo
(foo-method [this]))

(deftype Atype [x y]
Pfoo
(foo-method [this] (do-something)))

(defn foo [arg] (foo-method arg))

并且通常期望客户端调用函数 foo,而不是协议(protocol)中的 foo 方法。 (有关此类事情的具体示例,请参见 clojurescript core 顶部的协议(protocol)。

那么为什么协议(protocol)经常被隐藏在函数后面呢?协议(protocol)方法不能成为面向客户端的部分,而不是包装功能吗?

最佳答案

协议(protocol)代表两种具体实体之间的接口(interface)点。一个是调用协议(protocol)的代码(在您的示例中调用 foo 的任何内容),另一个是实现它的代码( Atype foo-method )。对一个人方便的事情可能对另一个人不方便。实现者希望提供完整的最小接口(interface),而调用者希望能够支持最丰富的 API。

您提到了 ClojureScript 核心;看看ISeq那里的协议(protocol)。它由几种类型实现,每种类型都必须实现-first-rest .为了使这些尽可能容易实现,都不需要在其 arg 上调用 seq。但是,相关功能firstrest面对调用者支持传入非序列,如字符串、向量等,因此这种通用功能由非协议(protocol)函数提供。当然,面向调用者的 API 甚至比 next 更丰富。 , map , filter 、顺序解构等都建立在 -first 之上和 -rest .

fns 提供的封装协议(protocol)方法的其他常见功能包括参数验证(例如断言)、默认参数和对 var-args 的支持。

关于clojure - 为什么 clojure 协议(protocol)方法经常被函数包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com