2013-09-04 20 views
6

jestem zabawy z przykładów kodu związanych Scala w działaniu książki http://www.manning.com/raychaudhuri/parametry funkcyjne i bez() w Scala

cytując https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala

// Run with >scala LoopTill.scala or 
// run with the REPL in chap01/ via 
// scala> :load LoopTill.scala 

object LoopTillExample extends App { 
    def loopTill(cond: => Boolean)(body: => Unit): Unit = { 
    if (cond) { 
     body 
     loopTill(cond)(body)  
    } 
    } 

    var i = 10 
    loopTill (i > 0) {  
    println(i) 
    i -= 1 
    } 
} 

W powyższym kodzie cond: => Boolean gdzie jestem zdezorientowany. Po zmianie tego na cond:() => Boolean nie udało się.

mógłby ktoś wytłumaczyć mi, co jest różnica między

cond: => Boolean 

i

cond:() => Boolean 

prawda obaj reprezentują params dla funkcji?

+2

Zobacz http://stackoverflow.com/a/1203799/724361. –

+1

Są zasadniczo takie same. Oba kompilują się do Function0 [Boolean]. Jedyna różnica polega na tym, że call-by-name (cond: => Boolean) jest nieco krótszy, ponieważ nie trzeba pisać loopTill (() => i> 0) (...) – ZhekaKozlov

Odpowiedz

7

Nie jestem ekspertem od scala, więc przyjmij moją odpowiedź z ciężkim ziarnem soli.

Pierwsza, cond: => Boolean, jest parametrem nazwy. Aby wszystko było proste, jest to w istocie cukier syntaktyczny dla funkcji 0 - jest to funkcja, ale traktujesz ją jako zmienną.

Drugi, cond:() => Boolean, jest jawnym parametrem funkcji - kiedy odwołujesz się do niego bez dodawania parametrów, nie wywołujesz tej funkcji, odwołujesz się do niej. W twoim kodzie if(cond) nie może działać: funkcja nie może być użyta jako boolowska. Jego wartość zwrotna może być oczywiście taka, dlatego musisz ją zdecydowanie przetestować (if(cond())).

Istnieje bogata dokumentacja dotycząca parametrów o nazwie, bardzo ważna funkcja w Scali, ale o ile rozumiem, można ją uznać za cukier syntaktyczny.