2014-07-11 13 views
5

Sto cercando di entrare in Scala cercando di usare Scalatra. Ho finito corso Martin Odersky su Coursera po 'di tempo fa, ma ho ancora un momento difficile understaning come funziona:Quali concetti di Scala vengono usati per far funzionare Scalatra DSL?

package com.example.app 
import org.scalatra._ 

class HelloWorldApp extends ScalatraFilter { 
    get("/") { 
    <h1>Hello, {params("name")}</h1> 
    } 
} 

Questo esempio è tratto dalla pagina principale del Scalatra: http://www.scalatra.org/

Come si esegue questa dichiarazione:

 
get("/") { 
    Hello, {params("name")} 
} 

È {} un parametro di get() metodo? Puoi spiegare quali caratteristiche del linguaggio Scala sono in uso qui? Puntatori al codice sorgente di Scalatra sarebbe perfetto per definire che sarebbe perfetto.

+0

Allo stato attuale, mi aspetto che questo essere chiuso come "poco chiaro quello che stai chiedendo" o "troppo ampia". Presumibilmente capisci alcune delle affermazioni. Puoi essere più esplicito su quali parti hai problemi? –

+0

Modificata la domanda per renderla meno ampia :) – atok

risposta

7

get è definita CoreDsl come segue

def get(transformers: RouteTransformer*)(block: => Any): Route 

Quindi, get prende due parametri, una sequenza di trasformatori rotta (stringhe sono implicitamente convertiti in trasformatori rotta) e un metodo senza parametri che emette qualcosa di tipo Any. La parte interessante qui è questo secondo parametro.

La prima cosa da capire è che i metodi senza parametri come argomenti delle funzioni sono gestite specialmente in Scala, vale a dire come chiamata per nome, vedi Automatic Type-Dependent Closure Construction e anche Scala Language Reference, Section 6.6, p. 78, which is p. 86 of the PDF:

Il caso di un parametro formale con un metodo senza parametro => T viene trattato in modo speciale. In questo caso, l'argomento effettivo corrispondente espressione e non viene valutato prima dell'applicazione. Invece, ogni utilizzo di nella sezione destra della regola di riscrittura comporta una nuova valutazione di e. In altre parole, l'ordine valutazione per => -parametri è chiamata per nome che l'ordine di valutazione per normali parametri è chiamata per valore.

Il secondo aspetto è che nell'applicazione funzione, argomenti possono essere racchiusi sia in () (gli argomenti "normali") o {} (più precisamente, in questo caso devono essere block expressions, e possono anche iniziare un nuova linea), vedere Scala Language Reference on Function Application, Section 6.6 on p. 77, which is p. 85 of the PDF.

Si noti inoltre come queste due funzioni siano una parte significativa di ciò che rende Scala un linguaggio attraente per la definizione di DSL (o nuove funzionalità simili a parole chiave).

Parti alla seguente domanda potrebbe anche essere interessante What's the difference between multiple parameters lists and multiple parameters per list in Scala?

+0

Grazie! Questo mostra il livello richiesto di conoscenza per usare consapevolmente strumenti come Scalatra. – atok

+0

Beh, forse. In realtà, puoi usarlo senza sapere gran parte di ciò - come dice @godfatherofpolka, è ciò che lo rende attraente come per DSL/parole chiave, ma un utente non ha bisogno di sapere come sono implementati –

1

È {} un parametro del metodo get()?

Sì. get avrà due liste di parametri. Uno è per il percorso "\" e l'altro per il blocco da eseguire. I blocchi sono inclusi in {}, i parametri in (). Quindi sembrerebbe avere a chiamarlo come

class HelloWorldApp extends ScalatraFilter { 
    get("/") ({ 
    <h1>Hello, {params("name")}</h1> 
    }) 
} 

ma c'è un po 'di zucchero sintattico che consente a un singolo parametro in {} da passare senza dover aggiungere il (). Si vede questo più comunemente nelle cose come

myList foreach { do_something() } 

E 'una caratteristica molto utile per scrivere quello che sembrano, e sono utilizzati come, le nuove strutture di controllo, ma sono in realtà solo funzioni.