定义 Clojure 多方法

发布于 2024-09-05 17:46:32 字数 444 浏览 4 评论 0原文

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

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

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

(isa? ::square ::shape)

返回true。但是,当我在实际实现多种绘图方法的命名空间中执行以下命令时,

(isa? ::square ::shape)

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

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

I have the following in one namespace say shapes:

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

Now executing the following in the shapes namespace:

(isa? ::square ::shape)

returns true. But when I execute the following in a namespace where I actually implement multimethods for drawing,

(isa? ::square ::shape)

it returns false. So even though I have the correct multimethod dispatch functions in place I get an error that says "no dispatch function found".

Am I missing something? Implementing all types of shapes in one giant namespace seems pointless to me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

人间☆小暴躁 2024-09-12 17:46:32

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

Turns out, :: uses the current namespace so in order to use types from other namespaces you need to use fully qualified names such as :shapes/square.

淡莣 2024-09-12 17:46:32

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

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

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

You are correct, in your self-answer, that the :: operator locates something in the current namespace.

One interesting point is that the keywords can be namespaced in any namespace you like, even one which isn't declared in any file. So if your namespace tree is complicated, and you prefer :geometry/square, :geometry/circle, and the like, you can just use that.

Also, don't forget that derive, underive (don't use underive right now), isa? and related functions all let you use an independent hierarchy if you want. See When and how should independent hierarchies be used in clojure?

凯凯我们等你回来 2024-09-12 17:46:32

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

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

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

You can use :: also with namespace aliases.

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

Now: ::short/abc will refer be the same as :some.terr.ibly.long.package.name/abc

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文