派遣功能

时间:2010-05-18 06:51:16

标签: scala function lift

究竟什么是派遣功能?我用谷歌搜索过,一切都模糊不清。它们似乎只是嵌套在其他函数内的块/闭包?从scala /提升点说起......但我认为它是普遍的,我也看到过它们在ruby中提到过。

2 个答案:

答案 0 :(得分:7)

调度的目标是动态决定你的功能。

如果你有(动态)调度功能它是主要的(或者只是,如果你不需要转换或其他转换),责任是决定调用哪个其他函数。该决定通常基于调用该方法的实例的类型,或某些参数的类型,但它也可以取决于例如。 on参数的值,或一些配置值。

可以对调度规则进行硬编码(使用例如scala中的模式匹配),或者可以来自调度表。

正如你所提到的那样,有几种变体,比如单一调度(具体方法取决于调用原始方法的实例,这是一种基本的OO机制),double dispatch(调度函数调用不同的具体函数,具体取决于调用中涉及的多个对象的运行时类型)。

相关的设计模式是访问者,它允许您动态地向现有类添加一组函数,并在其核心部署动态调度。

当您在调度方法内部或某些初始化代码(例如,调度表)中定义具体方法时,会出现嵌套的块/闭包。

调度基于参数值,硬编码决策和调度表的情况的简单示例:

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

答案 1 :(得分:3)

Dispatch是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)

希望这有帮助。