clojure - 命名空间映射命名空间上的多方法调度
问题描述
是否可以基于命名空间映射命名空间进行调度,即#:<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
您可以在该集中指定多个名称空间前缀,或者您可以dispatch-fn
根据您的用例使用不同的名称空间前缀。
推荐阅读
- c# - 有没有办法从托管在 Web 服务器中的 Web 应用程序访问客户端(用户)特殊文件夹
- android - 我们可以在没有特定平台的情况下集成 Firebase 并响应本机应用程序吗?
- c - 将指针传递给函数中的重新分配指针
- .net-core - .NET Core 3.0 中的 Outlook 互操作?
- c# - 如何检查角色列表中的角色?
- javascript - 检查 getAttribute 是否未定义
- android - 如何从 dialogfragment 更新 recyclerview 项目?
- android - 如何修复:程序集“Xamarin.Android.Support.Compat”中的预期类“Android.Support.V4.Content.PermissionChecker”?
- c# - Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?
- node.js - nodeJs 来自 ajax 的请愿书不显示错误页面