0

これは、Play Framework に付属するサンプルから取得したアクション構成です。

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

したがって、andをSecurity.Authenticated取り、2 番目の括弧のグループはusername: RequestHeader => Option[String]onAuthorized: RequestHeader=>SimpleResultString => Action[A]

そして、コントローラーには次のものがあります。

def index = isAuthenticated { ...code }}  

上のコードがこれなので、これがf関数だと思います=> String => Request[AnyContent] => Result。さて、私が理解していないのは、ここで実際に何が起こっているのかということです. について話しているのではなく、 についてUser.findByEmail....話しているのですusername => _ => ...。この関数を直接呼び出した場合、この関数のシグネチャはどのようになりますか?

username => _ =>
    User.findByEmail(username).map { user =>
      Ok(
        html.dashboard(
          Project.findInvolving(username), 
          Task.findTodoInvolving(username), 
          user
        )
      )
    }.getOrElse(Forbidden)  

もしあればdef isAuthenticated(f: => Request[AnyContent] => Result)、私はそれを使用する方法を知っているだろうし、それを理解するだろう. しかし、余分な「データ」が私を混乱させています。

アップデート:

私は何かを見つけたと思います:

def f2: String => Int => List[Char] = x => _ => x.toList  

そして、これは次のように呼び出されます。

f2("Andrew")(2) //there can be anything replacing 2 because I don't have access to it anyway  

したがって、私が主に尋ねた上記の機能は次のようになります。

def f: => String => Request[AnyContent] => Result = username => _ => User.find.....  

私は正しいですか?
「No by name parameter allowed here エラー」が表示されます。

2 番目のパラメーターを使用しない場合、String => Request => Result単純にではなく、なぜ使用しているのString => Resultですか?

4

2 に答える 2

1

その関数定義は、実際にはカリー化された関数定義です。

String => Request => Result実際の意味:f(s:String):(r:Request)=>Resultつまり、文字列を受け取り、要求を受け取って結果を返す関数を返す関数。

「機能を強化する」の部分をチェックしてください: http://danielwestheide.com/blog/2013/01/30/the-neophytes-guide-to-scala-part-11-currying-and-partially-applied-functions .html

于 2013-05-25T17:31:28.493 に答える
0

私にとって、https://github.com/mariussoutier/PlayBasics/tree/master/play-2.2-migrationの例は非常に啓発的です。

于 2014-02-13T09:41:05.230 に答える