Sea*_*lan 43 clojure multimethod
我是Clojure新手并且正在寻找何时使用协议以及何时使用多方法的一些具体示例.我知道协议通常适用于创建类型层次结构和典型的OOP事物,它们是在多方法之后添加到语言中的,并且协议通常具有更好的性能,所以我的问题是:
协议是否意味着取代多方法?如果没有,你能给我一个例子,我会使用多方法而不是协议吗?
mik*_*era 35
协议和多方法是互补的,适用于略有不同的用例.
一般来说,我的建议是使用协议,除非你有一个需要多方法的特定情况.
您可能需要多方法的情况如下:
(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!")))
Run Code Online (Sandbox Code Playgroud)
请注意,由于以下两个原因,您无法在此处使用协议:
Art*_*ldt 34
多方法更强大,更昂贵,
当它们足够时使用协议,但如果你需要根据从火星上看到的月相来发送,那么多方法是你的最佳选择.
存在允许简单的东西保持简单的协议,并为clojure提供了一种生成与等效java相同的字节码的方法.似乎大多数人大多数时候都在使用协议.当我需要派遣多个参数时,我会使用多方法,尽管我不得不承认这只会出现一次,并且isa更少使用完整的层次结构(由我).所以简而言之,在需要时使用Multimethods
最好的例子在我的expierence中,就在core.clj的开头
正如亚瑟所提到的,多方法更强大,更昂贵.实际上,协议可以被认为是调度函数所在的多个方法的特例 class.当然,事实并非如此,因为协议不止于此.
如果你需要派遣第一个参数的类以外的东西,你需要使用多方法或重新设计.调度类型是协议的一个很好的用例.
| 归档时间: |
|
| 查看次数: |
6099 次 |
| 最近记录: |