這是從附帶的Play框架斯卡拉+播放框架:動作組合物的解釋需要
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
因此,一個樣本所採取的行動的組合物,Security.Authenticated
需要一個username: RequestHeader => Option[String]
和onAuthorized: RequestHeader=>SimpleResult
和括號的第二組採取String => 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)
我會知道如何使用它,我會理解它。但額外的「數據」令我感到困惑。
UPDATE:
我想我發現了一些:
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參數允許此處出錯」。
如果他們不使用第二個參數,他們爲什麼使用String => Request => Result
而不僅僅是String => Result
?
也許有時你需要第二個參數:https://github.com/playframework/Play20/blob/master/samples/scala/zentasks/app/controllers/Projects.scala#L38 –