gpt4 book ai didi

Clojure 多方法与协议(protocol)

转载 作者:行者123 更新时间:2023-12-03 06:49:22 24 4
gpt4 key购买 nike

我是一名 Clojure 新手,一直在寻找一些何时使用协议(protocol)以及何时使用多重方法的具体示例。我知道协议(protocol)通常旨在创建类型层次结构和典型的 OOP 事物,它们是在多方法之后添加到语言中的,并且协议(protocol)通常具有更好的性能,所以我的问题是:

协议(protocol)是否旨在取代多方法?如果没有,您能给我一个使用多种方法而不是协议(protocol)的例子吗?

最佳答案

协议(protocol)和多方法是互补的,适用于略有不同的用例。

  • 协议(protocol)根据第一个参数的类型提供高效的多态调度。由于能够利用一些非常高效的 JVM 功能,因此协议(protocol)可以为您提供最佳性能
  • 多方法支持非常灵活的多态性,可以根据方法参数的任何函数进行调度。多种方法速度较慢,但​​非常灵活

一般来说,我的建议是使用协议(protocol),除非您有需要多种方法的特定情况。

您可能需要多种方法的情况如下所示:

(defn balance-available? [amount balance] (> balance amount))

(defmulti withdraw balance-available?)

(defmethod withdraw true [amount balance]
(- balance amount))

(defmethod withdraw false [amount balance]
(throw (Error. "Insufficient balance available!")))

请注意,由于以下两个原因,您无法在此处使用协议(protocol):

  • 调度函数需要使用两个参数来确定使用哪个方法实现(即它是多重调度情况)。
  • 您也无法区分第一个参数的类型(大概始终是数值)

关于Clojure 多方法与协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070368/

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