Функции отправки

Что такое точно функции отправки? Я погуглил их, и все неопределенно. Они, кажется, просто вложенные блоки/закрытия в других функциях? Разговор от точки scala/lift.. но я предполагаю, что это универсально, я видел их упомянутый в рубине также.

6
задан iAmDecim 18 May 2010 в 06:51
поделиться

2 ответа

Цель диспетчеризации - динамически решать, что делать в вашей функции.

Когда у вас есть (динамическая) функция диспетчеризации, ее основная (или единственная, если вам не требуется приведение типов или другие преобразования) ответственность состоит в том, чтобы решить, какую другую функцию вызывать. Решение часто основывается на типе экземпляра, для которого вызывается метод, или типе некоторых параметров, но оно также может зависеть, например, от значения параметра (ов) или некоторых значений конфигурации.

Правило диспетчеризации может быть жестко запрограммировано (например, с использованием сопоставления с образцом в scala) или может исходить из таблицы диспетчеризации.

Как вы упомянули, существует несколько вариантов, таких как одиночная отправка (конкретный метод зависит от экземпляра, для которого вызывается исходный метод, который является базовым механизмом объектно-ориентированного программирования), двойная отправка (отправляет вызов функции различным конкретным функциям в зависимости от типы времени выполнения нескольких объектов, участвующих в вызове).

Связанный шаблон проектирования - это посетитель, который позволяет вам динамически добавлять набор функций к существующим классам и который также имеет динамическую отправку в своей основе.

Вложенные блоки / замыкания появляются, когда вы определяете конкретный метод внутри метода диспетчеризации или в некотором коде инициализации (например, для таблицы диспетчеризации).

Простой пример для случая, когда диспетчеризация основана на значении параметра, с жестко запрограммированным решением и с таблицей диспетчеризации:

   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()
     }
   }
7
ответ дан 10 December 2019 в 00:35
поделиться

Диспетчерская служба - это термин, который Lift использует для отправки запросов веб-служб.

Самый простой способ определить функцию отправки с помощью 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)

Надеюсь, это поможет.

3
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: