我有三个文件/ ns称为world.clj
,node.clj
和protocols.clj
。 Node
记录实现了一个名为movable
的协议。然后,我想从world.clj
(维护节点状态等)调用它,但我无法弄清楚如何。我需要:require
在哪里?
protocols.clj:
(ns mesh.protocols)
(defprotocol movable
(move [this pos])
node.clj:
(ns mesh.node
(:require [mesh.protocols :refer [movable]]))
(defrecord Node [...]
movable
(move [this pos] ...))
world.clj:
(ns mesh.world
(:require ???))
(defn update-world [world]
...
(move node new-pos))
我需要在world.clj
中要求我在move
中调用Node
的实施内容?根据我的尝试,我会得到各种例外情况,例如下面的情况。
Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: move in this context, compiling:(mesh/world.clj:13:29)
Exception in thread "main" java.lang.IllegalAccessError: move does
not exist, compiling:(mesh/world.clj:1:1)
是否可以使用正确的:require
解决此问题,还是需要移动内容?在那种情况下,你会如何建议我组织这些东西呢?
答案 0 :(得分:4)
defprotocol
(除其他外)定义封闭命名空间中的函数。客户端就像调用任何常规函数一样调用这些“多态”函数。
(ns mesh.world
(:require [mesh.protocols :as meshp]))
(defn update-world [world]
...
(meshp/move node new-pos))