2012-02-18 7 views
16

Widziałem tego rodzaju kodu wiele razy, ostatnio na liście dyskusyjnej scala-user:Co oznacza słowo kluczowe "niejawny", gdy znajduje się przed parametrem wyrażenia lambda?

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

context jest zdefiniowany jako:

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

czego służy keeyword implicit osiągnąć po umieszczeniu przed parametrem wyrażenia lambda?

+0

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

+1

Dla potomności, dodatkowe szczegółowe wyjaśnienie: http: // daily- scala.blogspot.com/2010/04/implicit-parameters.html –

Odpowiedz

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 

Ostatnia linia jest w istocie skrótem do drugiej.

+1

BTW, zamiast używać niejawnych parametrów do propagowania kontekstu (w tym przykładzie, 'Conn') poprzez obliczenia, można użyć monitory Reader. https://gist.github.com/1395578 ​​ – retronym

+0

To wyjaśnia. Dzięki! – missingfaktor

+2

Dzięki za sedno też. Oznaczono gwiazdką. – missingfaktor