2010-05-18 25 views
6

调度功能到底是什么?我搜索了他们,都是模糊的。他们似乎只是在其他功能内嵌套块/关闭?从一个scala/lift点..说话但我认为它是普遍的,我也看到他们在红宝石中提到。调度功能

+0

强制性博客链接:http://cleverlytitled.blogspot.com/2010/01/dynamic-dispatch-in-scala.html – 2010-05-18 15:16:12

回答

7

调度的目标是动态地决定在你的函数中做什么。

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

调度规则可以是硬编码的(例如使用scala中的模式匹配),也可以来自调度表。正如你所提到的,有几种变化,比如单个调度(具体方法取决于调用原始方法的实例,这是一个基本的OO机制),double dispatch(调度函数调用不同的具体函数,取决于呼叫中涉及的多个对象的运行时类型)。

相关的设计模式是Visitor,它允许您动态地将一组函数添加到现有类中,并且在其核心还具有动态分派。

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

的情况下,一个简单的例子,当调度是基于参数的值,用硬编码的决定,并与调度表:

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

希望这有助于。