6

调度函数到底是什么?我用谷歌搜索了它们,一切都很模糊。它们似乎只是其他函数内部的嵌套块/闭包?从 scala/lift point 说起..但我认为它是通用的,我也看到他们在 ruby​​ 中提到过。

4

2 回答 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 回答