2012-02-18 48 views
16

Tôi đã thấy loại mã này nhiều lần trước đó, gần đây nhất là tại mailing list scala người dùng:Từ khóa 'ngầm định' có nghĩa là gì khi được đặt ở phía trước tham số biểu thức lambda?

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

context được định nghĩa là:

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

mục đích gì các keeyword implicit đạt được khi đặt trước một tham số biểu thức lambda?

+0

có thể trùng lặp: [Scala Functional Literals with Implicits] (http://stackoverflow.com/questions/6326132/scala-functional-literals-with-implicits) – sschaef

+1

Đối với hậu thế, giải thích chi tiết bổ sung: http: // daily- scala.blogspot.com/2010/04/implicit-parameters.html –

Trả lời

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 

Dòng cuối cùng về cơ bản là viết tắt của lần cuối thứ hai.

+1

BTW, thay vì sử dụng các tham số ngầm định để truyền bá ngữ cảnh (trong ví dụ này, 'Conn') thông qua tính toán, bạn có thể sử dụng trình đơn Reader. https://gist.github.com/1395578 ​​ – retronym

+0

Điều đó giải thích điều đó. Cảm ơn! – missingfaktor

+2

Cũng xin cảm ơn vì ý chính. Đóng vai chính nó. – missingfaktor

Các vấn đề liên quan