【问题标题】:Multimethod dispatch on namespaced map namespace命名空间映射命名空间上的多方法调度
【发布时间】:2018-04-30 12:03:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: clojure namespaces multimethod


    【解决方案1】:

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

    (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

    【讨论】:

      【解决方案2】:

      这是不可能的,因为这只是writer 生成的地图的视觉表示。如果地图中的所有键共享相同的命名空间,您必须自己进行检查。最后一个示例也不会由编写器生成 - 只有在 all the keys share the same namespace 时才会发出命名空间映射字面量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多