Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义Clojure多方法_Clojure_Multimethod - Fatal编程技术网

定义Clojure多方法

定义Clojure多方法,clojure,multimethod,Clojure,Multimethod,我在一个名称空间中有以下内容,比如shapes: (derive ::rect ::shape) (derive ::square ::rect) 现在在shapes命名空间中执行以下操作: (isa? ::square ::shape) 返回true。但当我在一个名称空间中执行以下操作时,我实际上实现了用于绘图的多方法 (isa? ::square ::shape) 它返回false。因此,即使我有正确的多方法分派函数,我也会得到一个错误,上面写着“找不到分派函数” 我错过什么了吗?在一

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

(derive ::rect ::shape)
(derive ::square ::rect)
现在在
shapes
命名空间中执行以下操作:

(isa? ::square ::shape)
返回
true
。但当我在一个名称空间中执行以下操作时,我实际上实现了用于绘图的多方法

(isa? ::square ::shape)
它返回
false
。因此,即使我有正确的多方法分派函数,我也会得到一个错误,上面写着“找不到分派函数”


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

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

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

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


另外,别忘了派生,underive(现在不要使用underive),isa?如果需要,所有相关函数都允许使用独立的层次结构。请参见您可以将
也与命名空间别名一起使用

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

现在:
::short/abc
将与
:some.terr.bly.long.package.name/abc

相同。这不是
:short/abc
吗?不。但我必须再键入12个字符。