Was genau sind Versandfunktionen? Ich habe sie gegooglet und alles ist vage. Sie scheinen nur verschachtelte Blöcke innerhalb anderer Funktionen zu sein. Von einer Scala/Lift Point sprechen..aber ich nehme an, es ist universell, ich habe sie auch in Ruby erwähnt.Versandfunktionen
Antwort
Ziel des Dispatchings ist es, dynamisch zu entscheiden, was in Ihrer Funktion zu tun ist.
Wenn Sie eine (dynamische) Dispatch-Funktion haben, ist es die Hauptaufgabe (oder nur, wenn Sie keine Casting- oder andere Konvertierungen benötigen), welche andere Funktion aufgerufen werden soll. Die Entscheidung basiert oft auf dem Typ der Instanz, für die die Methode aufgerufen wird, oder auf der Art einiger der Parameter, aber sie kann auch z. auf den Wert des Parameters oder einiger Konfigurationswerte.
Die Dispatching-Regel kann fest codiert sein (z. B. Mustervergleich in Scala) oder aus einer Versandtabelle stammen.
Wie Sie bereits erwähnt haben, gibt es verschiedene Varianten, wie Einzelversand (konkrete Methode hängt von der Instanz der ursprünglichen Methode ab, die ein einfacher OO-Mechanismus ist), Doppelversand (löst je nach Aufruf einen Funktionsaufruf zu verschiedenen konkreten Funktionen aus die Laufzeittypen mehrerer am Aufruf beteiligter Objekte).
Ein verwandtes Entwurfsmuster ist der Besucher, mit dem Sie eine Reihe von Funktionen dynamisch zu vorhandenen Klassen hinzufügen können und die dynamische Verteilung im Kern hat.
Die verschachtelten Blöcke/Schließungen werden angezeigt, wenn Sie die konkrete Methode in der Dispatch-Methode oder in einem Initialisierungscode (z. B. für die Versandtabelle) definieren.
Ein einfaches Beispiel für den Fall, wenn Versendung auf dem Wert des Parameters basiert, mit fest codierter Entscheidung und mit Dispatch-Tabelle:
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()
}
}
Versand ist der Begriff Aufzug verwendet Anfragen Web-Service für den Versand.
Der einfachste Weg, um die Dispatch-Funktion mit RestHelper (siehe http://www.assembla.com/wiki/show/liftweb/REST_Web_Services)
Zum Beispiel zu definieren:
object MyRestService extends RestHelper {
serve {
case "api" :: "user" :: AsLong(id) :: _ XmlGet _ => <b>ID: {id}</b>
case "api" :: "user" :: AsLong(id) :: _ JsonGet _ => JInt(id)
}
}
Dann in Boot.scala:
LiftRules.dispatch.append(MyRestService)
Hoffnung, das hilft.
Obligatorischer Blog-Link: http://cleverlytitled.blogspot.com/2010/01/dynamic-dispatch-in-scala.html –