调度函数到底是什么?我用谷歌搜索了它们,一切都很模糊。它们似乎只是其他函数内部的嵌套块/闭包?从 scala/lift point 说起..但我认为它是通用的,我也看到他们在 ruby 中提到过。
问问题
3141 次
2 回答
7
调度的目标是动态地决定在你的函数中做什么。
当您有一个(动态)调度函数时,它的主要(或唯一,如果您不需要强制转换或其他转换)责任是决定调用哪个其他函数。该决定通常基于调用该方法的实例的类型或某些参数的类型,但它也可以取决于例如参数的值或某些配置值。
调度规则可以是硬编码的(例如使用 scala 中的模式匹配),或者可以来自调度表。
正如您所提到的,有几种变体,例如单分派(具体方法取决于调用原始方法的实例,这是一种基本的OO机制),双分派(根据运行时类型将函数调用分派给不同的具体函数)调用中涉及的多个对象)。
一个相关的设计模式是访问者,它允许您向现有类动态添加一组函数,并且其核心也具有动态调度。
当您在调度方法内部或在某些初始化代码(调度表的 ef)中定义具体方法时,会出现嵌套块/闭包。
调度时的一个简单示例是基于参数的值,使用硬编码决策和调度表:
class Dispatch {
def helloJohn(): String = "Hello John"
def helloJoe(): String = "Hello Joe"
def helloOthers(): String = "Hello"
def sayHello(msg: String): String = msg match {
case "John" => helloJohn()
case "Joe" => helloJoe()
case _ => helloOthers()
}
val fs = Map("John" -> helloJohn _, "Joe" -> helloJoe _)
def sayHelloDispatchTable(msg: String): String = fs.get(msg) match {
case Some(f) => f()
case _ => helloOthers()
}
}
于 2010-05-18T07:58:10.427 回答
3
调度是 Lift 用于调度 Web 服务请求的术语。
使用 RestHelper 定义调度函数的最简单方法(参见http://www.assembla.com/wiki/show/liftweb/REST_Web_Services)
例如:
object MyRestService extends RestHelper {
serve {
case "api" :: "user" :: AsLong(id) :: _ XmlGet _ => <b>ID: {id}</b>
case "api" :: "user" :: AsLong(id) :: _ JsonGet _ => JInt(id)
}
}
然后在 Boot.scala 中:
LiftRules.dispatch.append(MyRestService)
希望这可以帮助。
于 2010-06-18T05:13:44.440 回答