2010-05-18 19 views
6

Tam olarak gönderme işlevleri nedir? Onları yönlendirdim ve her şey belirsiz. Diğer işlevlerin içinde sadece yuvalanmış bloklar/kapanışlar gibi görünüyorlar? Bir scala/lift noktasından bahsetmişken .. ama evrensel olduğunu varsayalım, onları yakutta da gördüğümü gördüm.Sevkiyat işlevleri

+0

Zorunlu blog bağlantısı: http://cleverlytitled.blogspot.com/2010/01/dynamic-dispatch-in-scala.html –

cevap

7

Gönderme amacı, işlevinizde ne yapacağınıza dinamik olarak karar vermektir.

Bir (dinamik) gönderme işleviniz varsa, ana (ya da yalnızca, dönüştürme veya başka dönüşümlere ihtiyacınız yoksa), başka hangi işlevin çağrılacağına karar vermeniz gerekir. Karar genellikle yöntemin çağrıldığı örneğin türüne veya bazı parametrelerin türüne dayanır, ancak aynı zamanda örn. Parametre (ler) veya bazı yapılandırma değerlerinin değeri hakkında. Gönderme kuralı, kodlanmış olabilir (örneğin scalada desen eşleştirmesi kullanılarak) veya bir gönderme tablosundan gelebilir.

Belirtildiği gibi, tek gönderme gibi (somut yöntem, orijinal yöntemin çağrıldığı örneğe bağlıdır, temel bir OO mekanizmasıdır), çift gönderim gibi farklı varyasyonlar vardır (farklı işlevlere göre bir işlev çağrısı gönderir) çağrıda yer alan birden fazla nesnenin çalışma zamanı türleri.

İlgili bir tasarım deseni, varolan sınıflara dinamik olarak bir dizi işlev eklemenize olanak tanıyan ve aynı zamanda özünde dinamik dağıtımı olan bir Ziyaretçi şeklidir.

İç içe geçirilen bloklar/kapaklar, gönderme yönteminin iç kısmındaki beton yöntemini veya bazı başlatma kodlarında (örneğin, gönderme tablosu için) tanımladığınızda görünür.

sevk kodlanmış kararla parametresinin değeri, üzerinde ve sevk tabloyla dayanır durum için basit bir örnek:

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

Sevk süreli Kaldırma web hizmetleri isteklerini sevk için kullanan bir sistemdir.

RestHelper kullanarak gönderme fonksiyonunu tanımlamak için en kolay yolu, örneğin

(http://www.assembla.com/wiki/show/liftweb/REST_Web_Services bakınız):

object MyRestService extends RestHelper { 
    serve { 
    case "api" :: "user" :: AsLong(id) :: _ XmlGet _ => <b>ID: {id}</b> 
    case "api" :: "user" :: AsLong(id) :: _ JsonGet _ => JInt(id) 
    } 
} 

sonra Boot.scala içinde: bu yardımcı

LiftRules.dispatch.append(MyRestService) 

Hope.