gpt4 book ai didi

clojure - 命名空间映射命名空间上的多方法调度

转载 作者:行者123 更新时间:2023-12-04 16:58:49 26 4
gpt4 key购买 nike

是否可以基于命名空间映射命名空间进行调度,即 #:<this-thing>{} ?没有像打印或检查键前缀这样的技巧?

我认为最后一个 hacky 因为可以覆盖键前缀:

(:qux/bar #:qux{:bar :baz}); => :baz
(:foo/bar #:qux{:foo/bar :baz}); => :baz
(:qux/bar #:qux{:foo/bar :baz}); => nil

最佳答案

映射可能包含来自某个命名空间的所有限定关键字键,或者它可能包含来自多个命名空间的非限定键或限定键的混合。这是一个从映射中的限定关键字键获取所有命名空间(作为关键字)的集合的函数:

(defn key-namespaces
"Returns set of all namespaces of keys in m."
[m]
(->> (keys m)
(keep (comp keyword namespace))
(set)))

现在您可以将其用作 dispatch-fn在多方法上:
(defmulti do-thing key-namespaces)
(defmethod do-thing #{:foo} [m] (prn m))
(do-thing #:foo{:bar 1})
;; #:foo{:bar 1}
(foo {:bar/bar 1})
;; no multimethod found exception

您可以在该集合中指定多个 namespace 前缀,或者您可以使用不同的 dispatch-fn根据您的用例。

关于clojure - 命名空间映射命名空间上的多方法调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100154/

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