2010-05-18 3 views
6

발송 기능이란 정확히 무엇입니까? 나는 그들을 봤는데 모두 모호하다. 그것들은 다른 함수 안에 중첩 된 블록/클로저처럼 보입니다. 스칼라/리프트 포인트라고 말하면서 보편적이라고 가정하지만 루비에서도 언급 한 것을 보았습니다.발송 기능

+0

필수 블로그 링크 : http://cleverlytitled.blogspot.com/2010/01/dynamic-dispatch-in-scala.html –

답변

7

디스패치의 목적은 함수에서 수행 할 작업을 동적으로 결정하는 것입니다.

(동적) 발송 기능을 사용하는 경우 주 (또는 전송 또는 기타 변환이 ​​필요하지 않은 경우에만) 책임은 다른 어떤 기능을 호출할지 결정하는 것입니다. 결정은 종종 메소드가 호출되는 인스턴스의 유형 또는 일부 매개 변수의 유형을 기반으로하지만, 예를 들어 메소드에 의존 할 수도 있습니다. 매개 변수 값 또는 일부 구성 값.

디스 패칭 규칙은 (예 : 스칼라의 패턴 일치를 사용하여) 하드 코드되거나 디스패치 테이블에서 나올 수 있습니다.

단일 디스패치 (구체적인 방법은 기본 OO 메커니즘 인 원본 메서드가 호출되는 인스턴스에 따라 달라짐), double dispatch (에 따라 다른 구체적인 함수로 함수 호출을 보내고 호출에 관련된 여러 객체의 런타임 유형).

관련 디자인 패턴은 Visitor입니다.이 패턴을 사용하면 기존 클래스에 동적으로 함수 세트를 추가 할 수 있으며 핵심에도 동적 디스패치가 있습니다.

중첩 된 블록/클로저는 사용자가 디스패치 메소드 또는 일부 초기화 코드 (예 : 디스패치 테이블의 경우)에서 구체적인 메소드를 정의 할 때 나타납니다.

디스패치는 하드 결정과 파라미터의 값과 디스패치 테이블에 기초하는 경우의 간단한 예 :

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

디스패치 용어 리프트가 웹 서비스 요청을 발송에 사용된다.

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) 

희망을.