4

场景:我想使用多方法在多个文件之间分派和传播功能。其中一个文件只包含多方法,为了使它们可用,我必须手动加载文件。有没有办法自动加载文件,而不是显式加载它?

这是我正在做的一个简单示例:

; app/core.clj
(ns app.core
  (:use [app.fruit.core :only [make-fruit]])
(println (:name (make-fruit :banana)))

; app/fruit/core.clj
(ns app.fruit.core)
(defmulti make-fruit identity)

; app/fruit/banana.clj
(ns app.fruit.banana
  (:use [app.fruit.core :only [make-fruit]])
(defmethod make-fruit :banana [fruit]
  {:name "banana" :color "yellow})

除非我在 app.core 中明确加载,否则不会加载fruit.banana 的方法,例如将其添加到 :use 组中。这似乎违背了使用多方法的目的,因为我仍然必须明确说明实现它的所有方法。

4

2 回答 2

0

你可以尝试在 app/fruit/core.clj 的底部:

(load "banana")
; Add other fruits here.

为了使其更灵活,您当然可以枚举所有文件,但遗憾的是,clojure.core/root-directory它是私有的。

于 2015-04-03T18:17:22.993 回答
0

除非您愿意,否则您不必明确表达。如果它们在另一个点被其他东西加载,这些方法将起作用。如果我想向 中添加一个方法make-fruit,那么我必须自己加载该方法。那时,任何调用make-fruit, 的代码都会知道我的新方法。

于 2014-02-18T14:04:04.317 回答