¿Qué son exactamente las funciones de despacho? Los busqué en Google y todo es vago. ¿Parecen simplemente bloques/cierres anidados dentro de otras funciones? Hablando desde un punto Scala/Lift ... pero supongo que es universal, también los he mencionado en ruby.Despacho funciones
Respuesta
El objetivo del envío es decidir dinámicamente qué hacer en su función.
Cuando tiene una función de despacho (dinámica) es principal (o solo, si no necesita conversión u otras conversiones) la responsabilidad es decidir a qué otra función llamar. La decisión a menudo se basa en el tipo de instancia al que se llama el método, o el tipo de algunos de los parámetros, pero también puede depender, p. sobre el valor de los parámetros, o algunos valores de configuración.
La regla de envío se puede codificar (utilizando, por ejemplo, coincidencia de patrón en scala), o puede provenir de una tabla de envío.
Como mencionó hay varias variaciones, como envío único (el método concreto depende de la instancia en que se invoca el método original, que es un mecanismo OO básico), despacho doble (distribuye una llamada de función a diferentes funciones concretas dependiendo de los tipos de tiempo de ejecución de múltiples objetos involucrados en la llamada).
Un patrón de diseño relacionado es el visitante, que le permite agregar un conjunto de funciones dinámicamente a las clases existentes y que también tiene un despacho dinámico en su núcleo.
Los bloques/cierres anidados aparecen cuando se define el método concreto dentro del método de envío, o en algún código de inicialización (por ejemplo, para la tabla de envío).
Un ejemplo sencillo para el caso en el despacho se basa en el valor del parámetro, con la decisión codificado y con mesa de despacho:
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()
}
}
TIG es el término Lift utiliza para el envío de solicitudes de servicios web.
La forma más fácil de definir la función de despacho utilizando RestHelper (ver http://www.assembla.com/wiki/show/liftweb/REST_Web_Services)
Por ejemplo:
object MyRestService extends RestHelper {
serve {
case "api" :: "user" :: AsLong(id) :: _ XmlGet _ => <b>ID: {id}</b>
case "api" :: "user" :: AsLong(id) :: _ JsonGet _ => JInt(id)
}
}
Luego, en Boot.scala:
LiftRules.dispatch.append(MyRestService)
Espero que esto ayude.
- 1. ¿Despacho dinámico de funciones de plantilla?
- 2. Despacho MouseEvent
- 3. ¿Despacho doble en C#?
- 4. Despacho múltiple en C++
- 5. Despacho doble/multimétodos en C++
- 6. Despacho de eventos JDI nullpointerexception
- 7. mesa virtual/mesa de despacho
- 8. Sobrecarga en Java y despacho múltiple
- 9. Android - Despacho de clave Tiempo de espera
- 10. Despacho de eventos personalizados con Dojo framework
- 11. Use invookedynamic para implementar despacho múltiple
- 12. Java despacho método con un argumento nulo
- 13. ¿Puedo envolver todas las solicitudes JAX-RS con código personalizado de pre-despacho, post-despacho y manejo de errores?
- 14. ¿CLOS tiene un despacho de especialización eql en cadenas?
- 15. despacho métodos S4 con una expresión como argumento
- 16. las variables de pasar al hilo de eventos Despacho
- 17. ¿Tiene cada NSThread automáticamente una cola de despacho?
- 18. ¿Cómo se analiza una solicitud JSON con Despacho?
- 19. Uso del despacho de Grand Central en Linux
- 20. despacho dependientes Medio Ambiente de protocolos/métodos múltiples en clojure
- 21. Módulo de publicación/suscripción/despacho recomendado de Python?
- 22. ¿Cómo funciona el doble despacho en el patrón de visitante?
- 23. funciones estáticas vs funciones const
- 24. Scala: funciones normales vs funciones agrupadas?
- 25. funciones dentro de las funciones en C
- 26. C++ Funciones de miembros vs funciones gratuitas
- 27. Equivalente de la cola de despacho serial de GCD en iOS 3.x
- 28. Configuración del encabezado del agente de usuario en Scala con Databinders Despacho Biblioteca
- 29. Google Analytics en iOS que devuelve NO en el despacho, sin resultado de depuración
- 30. ¿Cómo detener la ejecución de tareas en una cola de despacho?
Enlace de blog obligatorio: http://cleverlytitled.blogspot.com/2010/01/dynamic-dispatch-in-scala.html –