2012-12-23 32 views
10

Tôi hiểu rằng một phương pháp có thể có mã như thế này:Mũi tên chất béo nhiều, liên tiếp trong các tham số phương thức có ý nghĩa gì trong Scala?

def m(p1:Int => Int) ... 

Có nghĩa là phương pháp này có một chức năng p1 mà trả về một Int

Nhưng khi duyệt Play! đang khuôn khổ tôi tìm thấy một đặc điểm với các phương pháp không thể đọc:

trait Secured { 

    def username(request: RequestHeader) = request.session.get(Security.username) 

    def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login) 

    def withAuth(f: => String => Request[AnyContent] => Result) = { 
    Security.Authenticated(username, onUnauthorized) { user => 
     Action(request => f(user)(request)) 
    } 
    } 

    /** 
    * This method shows how you could wrap the withAuth method to also fetch your user 
    * You will need to implement UserDAO.findOneByUsername 
    */ 
    def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request => 
    UserDAO.findOneByUsername(username).map { user => 
     f(user)(request) 
    }.getOrElse(onUnauthorized(request)) 
    } 
} 

Play! Scala Security

nào f: User => Request[AnyContent] => Result nghĩa là gì? Thoạt nhìn, nó trông giống như một phương thức trả về một hàm r của kiểu Yêu cầu; r sau đó trả về một Result.

Đây có phải là giả định đúng không?

Trả lời

16

f: User => Request [AnyContent] => Result là gì? Thoạt nhìn nó trông giống như một phương thức trả về một hàm r của kiểu Request; r sau đó trả về kết quả.

f trả về một chức năng của loại Request[AnyContent] => Result, tức là một chức năng mà phải mất một Request[AnyContent] và trả về một Result.

Nói cách khác, f là hàm được thu thập. Bạn có thể gọi nó là f(user)(request) để lấy lại Result.

+0

Ok, mát mẻ. Nhưng tại sao điều này cần phải được xác định? Tại sao trình biên dịch không thể suy ra kiểu 'Request' trả về? Chỉnh sửa: nevermind, tôi giả sử các kiểu con của Yêu cầu có thể trả về các loại Kết quả khác nhau, vì vậy điều này hữu ích. –

+2

@ CameronA.Ellis Tôi không chắc chắn tôi hiểu nhận xét của bạn. Đối tượng 'Request' không trả về bất cứ thứ gì. Hàm trả về bởi 'f', có kiểu' Request [AnyContent] => Result' trả về 'Result'. Kiểu trả về không thể bị loại ra khỏi một kiểu hàm bởi vì sau đó nó sẽ giống như 'f' trả về một đối tượng' Request' - không phải là một hàm nhận một đối tượng 'Request', mà hoàn toàn khác. – sepp2k

+0

cảm ơn vì đã làm rõ điều đó. Làm cho toàn bộ ý nghĩa bây giờ. –

1

def withAuth(f: => String => Request[AnyContent] => Result) phương tiện, mà f là một tham số theo tên, và bạn có thể viết một cái gì đó như thế này:

withAuth { 
    logger.info("Here we go") 
    ... 
    chooseTheAction("list") 
} 

nơi chooseTheAction mất một String và trả về một chức năng thực hiện một yêu cầu, Request[AnyContent] => Result

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