Что означает ключевое слово «неявный», когда оно находится перед параметром лямбда-выражения? - PullRequest
16 голосов
/ 18 февраля 2012

Я видел этот код много раз прежде, совсем недавно в списке рассылки scala-user:

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

context определяется как:

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

Какую цель достигает ключевое слово implicit, если поместить его перед параметром лямбда-выражения?

1 Ответ

19 голосов
/ 18 февраля 2012
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

Последняя строка по сути является сокращением для второй последней.

...