【问题标题】:loading a file of multimethods only仅加载多方法文件
【发布时间】:2014-02-18 13:10:00
【问题描述】:

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

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

; 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})

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

【问题讨论】:

标签: clojure multimethod


【解决方案1】:

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

【讨论】:

  • 我想我明白了很多,但我的问题是文件中没有其他内容正在加载;它只包含多方法实现。所以在某些时候我必须显式地加载它,以便方法变得可用。如果无法避免这种情况,我可能会考虑使用 make-banana 之类的函数而不是通用形式,如果我必须明确的话。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多