2012-06-25 33 views
9

Tôi có một ứng dụngScala Chơi 2, đi qua yêu cầu phương pháp

TestController.scala

def foo(p1: String) = Action {implicit request => 
    Ok(bar(p1)) 
} 

private def bar(p1: String) = { 
//access request parameter here 
} 

Play 2.0 Có cách nào để sử dụng implicit để vượt qua request để bar

Trả lời

16

Vâng, bạn có thể:

def foo(p1: String) = Action { implicit request => 
    Ok(bar(p1)) 
    } 

    private def bar(p1: String)(implicit req: RequestHeader) = "content" 

Mã:

Action { implicit request 

cuộc gọi phương pháp này trên đối tượng Hành động:

def apply(block: Request[AnyContent] => Result): Action[AnyContent] = { 

Vì vậy, những gì bạn gọi là "yêu cầu" phù hợp với paramater có tên là "khối". Các "ngầm" ở đây là tùy chọn: nó làm cho giá trị "yêu cầu" có sẵn như là một tham số ngầm cho các cuộc gọi phương thức/hàm khác.

Hàm ẩn trong hàm "bar" của bạn cho biết rằng hàm này có thể lấy giá trị "req" từ giá trị ngầm định và không nhất thiết phải được chuyển một cách rõ ràng.

+0

Cảm ơn Adam, điều đó có hiệu quả. Theo dõi câu hỏi, liệu tiềm năng cần phải được chuyển qua như một tham số được curried? – Bob

+1

Trong scala, nó là tham số _list_, không phải tham số, đó là ngầm định. Tôi không chắc về động cơ đó. –

+1

scala> val ngầm i = 1 i: Int = 1 scala> val ngầm s = "hi" s: java.lang.String = hi scala> def concat (implicit x: Int, y: String) = x + y concat: (ngầm x: Int, ngầm y: String) String scala> concat res0: String = 1hi –

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