5

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

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

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

(isa? ::square ::shape)

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

(isa? ::square ::shape)

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

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

4

3 回答 3

3

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

于 2010-06-17T17:15:17.983 回答
0

在您的自我回答中,您是正确的, :: 运算符在当前命名空间中找到了某些东西。

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

另外,不要忘记派生,underive(现在不要使用underive),isa?和相关功能都可以让您根据需要使用独立的层次结构。请参阅何时以及如何在 clojure 中使用独立的层次结构?

于 2010-06-17T19:12:58.543 回答
0

您也可以使用::命名空间别名。

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

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

于 2010-06-17T21:23:55.940 回答