2

我正在尝试实现记录构造函数之间的数据调度。调度是由一个名称(它是一个字符串,与数据一起接收)完成的。我希望每个新记录类型都能自动注册调度。例如,在 Scala 中,我会做这样的事情:

object Dispatcher {
  val dispatchMap = scala.collection.mutable.Map[String, Creator]()
  def += (crt: Creator) { dispatcherMap += (crt.name, crt) }
}

abstract class Creator[C <: Creation](val name: String) {
  Dispatcher += this

  def apply(consData: ConstructionData): C

}

这样每次Creator创建类型的对象时,都会在 中注册,Dispatcher以后可以通过它的名称找到并通过ConstructionData来创建Creation

Clojure 中的等价物是什么?

4

1 回答 1

5

我会使用 map 和普通的旧函数方法,如下所示:

(ns creator)

(def dispatcher (atom {}))

(defn defcreator [name apply-fn]
  (swap! dispatcher assoc name apply-fn)
  apply-fn)

(defcreator :abc-creator (fn [cons-data] (do-something cons-data) ))
于 2013-02-25T14:09:26.347 回答