【问题标题】:Defining Clojure multimethods定义 Clojure 多方法
【发布时间】:2010-06-17 16:05:03
【问题描述】:

我在一个命名空间中有以下内容,比如shapes

(derive ::rect ::shape)
(derive ::square ::rect)

现在在shapes 命名空间中执行以下命令:

(isa? ::square ::shape)

返回true。但是当我在一个命名空间中执行以下操作时,我实际上实现了多种绘图方法,

(isa? ::square ::shape)

它返回false。因此,即使我有正确的多方法调度函数,我也会收到一条错误消息,提示“找不到调度函数”。

我错过了什么吗?在一个巨大的命名空间中实现所有类型的形状对我来说似乎毫无意义。

【问题讨论】:

    标签: clojure multimethod


    【解决方案1】:

    原来,:: 使用当前命名空间,因此为了使用其他命名空间中的类型,您需要使用完全限定名称,例如 :shapes/square。

    【讨论】:

      【解决方案2】:

      您的自我回答是正确的, :: 运算符在当前命名空间中定位某些内容。

      有趣的一点是,关键字可以在您喜欢的任何名称空间中命名,甚至是未在任何文件中声明的名称空间。因此,如果您的命名空间树很复杂,并且您更喜欢 :geometry/square、:geometry/circle 等,则可以使用它。

      另外,不要忘记派生,underive(现在不要使用underive),isa?和相关功能都可以让您根据需要使用独立的层次结构。见When and how should independent hierarchies be used in clojure?

      【讨论】:

        【解决方案3】:

        您也可以将:: 与命名空间别名一起使用。

        (ns some.other.package
          (:require [some.terr.ibly.long.package.name :as short]))
        

        现在:::short/abc 将与 :some.terr.ibly.long.package.name/abc 相同

        【讨论】:

        • 不应该是:short/abc吗?
        • 没有。但我必须再输入 12 个字符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 2012-10-04
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多