4

私は現在 play フレームワークから始めていますが、私の Scala の知識は十分ではありません。

私が知っているように、 => は IsAuthenticated がパラメーターとして何らかの関数を持っていることを示しています。f: => String... は入力値のない関数であることもわかりました。しかし、その 3 => を含む完全な行をどのように解釈すればよいでしょうか? さらに下に、=> f(user)(request) の 2 行目で正確に何が起こるのでしょうか? ユーザーとリクエスト オブジェクトのターゲット関数は何ですか?

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

2 に答える 2

0

受け入れられた回答へのいくつかの追加

  1. Security.Authenticated

    Security.Authenticated(username, onUnauthorized) { user => Action(request => f(user)(request)) }

    Security.Authenticated - パラメータの 2 つのリストを取る関数のようです。パラメータの最初のリスト:

    (username:String, onUnauthorized:Boolean)
    

    2 番目のリストは 1 つの引数です。

    (g:User => Action)
    

    完全な署名は次のようになります。

    def Authenticated(username:String, onUnauthorized:Boolean)(g:User => Action)
    
  2. Actionコンストラクターで関数を取るクラスのようです:

    class Action(h:Request => Result)
    

    コンストラクタへの引数は新しい関数です

    def hActual(request:Request):Result = f(user)(request)
    

    (引数で指定されていないため、スコープ内にあるdef必要がありuserます。たとえば、コンストラクター呼び出しのhActual直前に宣言できます。Action

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

    )

  3. また、curring を使用してコンストラクターを呼び出すことができるようです。

    def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
        Action(f(user))
    }
    
于 2013-08-13T17:03:26.530 に答える