2010-05-18 77 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) 

希望這有助於。