定义Clojure多方法

5

我在一个命名空间(例如shapes)中有以下内容:

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

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

(isa? ::square ::shape)

返回true。但是当我在实际实现绘图的命名空间中执行以下操作时,

(isa? ::square ::shape)

它返回false。所以即使我已经正确地放置了多方法分派函数,我仍然会收到一个错误,说“找不到分派函数”。

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

3个回答

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

0

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

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

现在:::short/abc 将会被视为与 :some.terr.ibly.long.package.name/abc 相同。

这个不应该是:short/abc吗? - amalloy
不行。但我必须再打12个字符。 - kotarak

0

你的自我回答中所说的 :: 运算符可以定位当前命名空间中的某些东西,是正确的。

有趣的一点是,关键词可以在任何你喜欢的命名空间中进行命名空间化,甚至可以是一个在任何文件中都未声明的命名空间。因此,如果您的命名空间树很复杂,并且您更喜欢使用 :geometry/square、:geometry/circle 等名称,那么您可以直接使用它们。

此外,不要忘记 derive、underive(现在不要使用 underive)、isa?以及相关的函数都可以让您使用独立的层次结构,如果您想的话。请参阅Clojure 中何时以及如何使用独立层次结构?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接