首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名称空间映射命名空间上的多方法调度

名称空间映射命名空间上的多方法调度
EN

Stack Overflow用户
提问于 2018-04-30 12:03:25
回答 2查看 188关注 0票数 0

是否可以基于名称空间映射命名空间(即#:<this-thing>{} )进行调度?没有像打印或检查钥匙前缀之类的黑客?

我认为最后一个是恶意的,因为键前缀可以被覆盖:

代码语言:javascript
复制
(:qux/bar #:qux{:bar :baz}); => :baz
(:foo/bar #:qux{:foo/bar :baz}); => :baz
(:qux/bar #:qux{:foo/bar :baz}); => nil
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-30 12:26:11

这是不可能的,因为这只是writer生成的映射的可视化表示。如果映射中的所有键共享相同的命名空间,则必须自己进行检查。另外,最后一个示例不会由作者产生--只有在所有键共享相同的命名空间。时,它才会发出名称空间的地图文字。

票数 1
EN

Stack Overflow用户

发布于 2018-04-30 12:26:46

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

代码语言:javascript
复制
(defn key-namespaces
  "Returns set of all namespaces of keys in m."
  [m]
  (->> (keys m)
       (keep (comp keyword namespace))
       (set)))

现在,您可以将其用作multimethod上的dispatch-fn

代码语言:javascript
复制
(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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50100154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档