gpt4 book ai didi

Clojure Multimethods 区分 map 和 map 列表

转载 作者:行者123 更新时间:2023-12-05 09:22:48 25 4
gpt4 key购买 nike

我想编写一个函数来处理一个特定事物(由 map 表示)或这些 map 的列表。

是否可以为此使用 defmulti/defmethod?谁能指出一个示例,说明如何编写 map 或 map 列表的测试函数?

最佳答案

Multimethods 将自动使用类层次结构,因此您只需打开类型即可:

(defmulti process class)

(defmethod process clojure.lang.IPersistentMap [m]
(println "got map"))

(defmethod process clojure.lang.Sequential [s]
(println "got sequential"))

(defmethod process :default [o]
(println "got something else"))

在构建此类案例时必须小心,以确保不会遇到满足两种情况的具体类型。如果是这样,则可以任意选择 - 使用 prefer-method 来定义首选项。 (另请注意,虽然您可以使用协议(protocol)执行与上面完全相同的实现,但没有等效的方法来选择协议(protocol)的首选结果)。

或者你可以让你的调度方法任意聪明地检测你关心的情况:

(defmulti process
(fn [o]
(cond
(map? o) :map
(sequential? o) :sequential
:else (class o))))

(defmethod process :map [m]
(println "got map"))

(defmethod process :sequential [s]
(println "got sequential"))

(defmethod process :default [o]
(println "got something else"))

关于Clojure Multimethods 区分 map 和 map 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602653/

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