2012-02-18 12 views
16

Ho visto questo tipo di codice molte volte in passato, la maggior parte di recente a mailing list scala-utente:Cosa significa la parola chiave "implicita" quando viene posta di fronte al parametro espressione lambda?

context(GUI) { implicit ec => 
    // some code 
} 

context è definito come:

def context[T](ec: ExecutionContext)(block: ExecutionContext => T): Unit = { 
    ec execute { 
    block(ec) 
    } 
} 

cosa serve il keeyword implicit raggiungere, quando sono immessi di fronte a un parametro di espressione lambda?

+0

possibile duplicato: [Scala Functional Literals with Implicits] (http://stackoverflow.com/questions/6326132/scala-functional-literals-with-implicits) – sschaef

+1

Per i posteri, spiegazione dettagliata aggiuntiva: http: // daily- scala.blogspot.com/2010/04/implicit-parameters.html –

risposta

19
scala> trait Conn 
defined trait Conn 

scala> def ping(implicit c: Conn) = true 
ping: (implicit c: Conn)Boolean 

scala> def withConn[A](f: Conn => A): A = { val c = new Conn{}; f(c); /*cleanup*/ } 
withConn: [A](f: Conn => A)A 

scala> withConn[Boolean](c => ping(c)) 
res0: Boolean = true 

scala> withConn[Boolean]{ c => implicit val c1 = c; ping } 
res1: Boolean = true 

scala> withConn[Boolean](implicit c => ping) 
res2: Boolean = true 

L'ultima riga è essenzialmente una scorciatoia per il penultimo.

+1

BTW, piuttosto che utilizzare parametri impliciti per propagare il contesto (in questo esempio, 'Conn') tramite il calcolo, è possibile utilizzare la monade Reader. https://gist.github.com/1395578 ​​ – retronym

+0

Questo lo spiega. Grazie! – missingfaktor

+2

Grazie anche per l'essenza. Starred it. – missingfaktor

Problemi correlati