ディスパッチ機能とは正確には何ですか?私はそれらをグーグルで検索しましたが、すべてがあいまいです。それらは、他の関数内にネストされたブロック/クロージャーのように見えますか? スカラ/リフトポイントから言えば..しかし、それは普遍的であると思います.Rubyでも言及されているのを見てきました.
2 に答える
ディスパッチの目的は、関数で何をするかを動的に決定することです。
(動的) ディスパッチ関数がある場合、その主な (または、キャストやその他の変換が必要ない場合のみ) 責任は、呼び出す他の関数を決定することです。多くの場合、決定は、メソッドが呼び出されるインスタンスのタイプ、または一部のパラメーターのタイプに基づいていますが、パラメーターの値や一部の構成値などに依存することもあります。
ディスパッチ ルールは、(たとえば、scala でのパターン マッチングを使用して) ハードコーディングするか、ディスパッチ テーブルから取得することができます。
あなたが言及したように、シングルディスパッチ(具象メソッドは元のメソッドが呼び出されるインスタンスに依存し、これは基本的なOOメカニズムです)、ダブルディスパッチ(実行時のタイプに応じて異なる具象関数に関数呼び出しをディスパッチします)のようないくつかのバリエーションがあります呼び出しに含まれる複数のオブジェクト)。
関連する設計パターンはビジターです。これにより、一連の関数を既存のクラスに動的に追加でき、コアに動的ディスパッチも含まれます。
ネストされたブロック/クロージャは、ディスパッチ メソッド内または初期化コード (ディスパッチ テーブルの場合は ef) 内で具象メソッドを定義すると表示されます。
ディスパッチがパラメーターの値に基づいており、ハードコーディングされた決定とディスパッチ テーブルを使用する場合の簡単な例:
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()
}
}
ディスパッチは、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)
お役に立てれば。