2012-12-23 4 views
10

は、私はこの方法は、このようなコードを持つことができることを理解:プレイを閲覧しながら、この方法を意味メソッドパラメータの複数の連続した太い矢印はScalaで何を意味しますか?

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

はのInt

を返す関数P1を取るしかし!

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

f: User => Request[AnyContent] => Resultはどういう意味:フレームワークのコードは、私が判読できないメソッドを持つ形質を見つけ?一見すると、それは、タイプRequestの関数rを返すメソッドのように見えます。 rResultを返します。

これは正しい仮定ですか?

答えて

16

f:User => Request [AnyContent] =>結果はどういう意味ですか?一見すると、それは、タイプRequestの関数rを返すメソッドのように見えます。 rは結果を返します。

fすなわちRequest[AnyContent]を取りResultを返す関数、タイプRequest[AnyContent] => Resultの機能を返します。

つまり、fはカルト機能です。 f(user)(request)と呼ぶと、Resultに戻ることができます。

+0

[OK]を、クール。しかし、なぜこれを指定する必要がありますか?コンパイラが 'Request'が返す型を推論できないのはなぜですか?編集:気にしない、私は、Requestのサブタイプが異なるタイプの結果を返すことができると思います。 –

+2

@ CameronA.Ellis私はあなたのコメントを理解しているかどうかはわかりません。 'Request'オブジェクトは何も返しません。 'Request [AnyContent] => Result'型の' f'によって返された関数は、 'Result'を返します。 'Request'オブジェクトを返す' Request'オブジェクトを返した 'f'のように見えるので、戻り値の型は関数の型から除外することはできません。 – sepp2k

+0

そのことを明確にしてくれてありがとう。今、完全に理解します。 –

1

def withAuth(f: => String => Request[AnyContent] => Result)手段は、fという名前によるパラメータであり、そしてあなたがこのような何か書くことができます:chooseTheActionStringを受け取り、要求を実行する関数を返す

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

Request[AnyContent] => Result

関連する問題