关于此函数如何返回值和使用分部函数的说明

  • 本文关键字:函数 说明 返回值 关于此 scala
  • 更新时间 :
  • 英文 :


当我看到一个看起来像这样的函数时,我会感到困惑:

def site(req: RequestHeader, emit: ClientEmit) = WebSocket(req) { sri => user =>

来源:此处

我想重新创建一个遵循相同模式的非常简单的函数,以巩固我对这里发生的事情的理解。

该函数调用WebSocket,然后似乎在外部函数站点的主体中传递了另一个函数调用。

sriuser来自哪里?它们不在范围内?

您的示例中的块WebSocket(req) { sri => user =>只是调用WebSocket方法。您的区块相当于:

def site(req: RequestHeader, emit: ClientEmit): Response = {
return WebSocket(req)(
new Function1[Sri, Function1[Option[User], Response]]() {
override def apply(sri: Sri): Function1[Option[User], Response] =
new Function1[Option[User], Response]() {
override def apply(user: Option[User]): Response = ??? 
}
}
)
}

在这里调用WebSocket方法sri => user => *do something* and return Response是两个Function1对象的语法糖,实际创建了应用方法。短音符是两个lambda表达式。只需阅读更多关于表达式和lambda表达式的内容。如果函数只包含一个表达式,则不需要曲线大括号,并且您可以只编写一个WebSocket方法调用,并将lambda表达式作为一个来自1个参数的函数传递给他,该函数将创建一个来自一个参数的功能,该参数将创建响应对象。

看看WebSocket方法:

private def WebSocket(req: RequestHeader)(f: Sri => Option[User] => Response): Response =
CSRF.check(req) {
ValidSri(req) { sri => auth(req) flatMap f(sri) }
}

我在这里写了他的扩展版本:

private def WebSocket(req: RequestHeader)(f: Sri => Option[User] => Response): Response =
CSRF.check(req) {
new Function0[Response] {
ValidSri(req) {
new Function1[Sri, Response]() {
sri: Sri =>
val futureOptionUser: Future[Option[User]] = auth.apply(req)
futureOptionUser.flatMap {
optionUser: Option[User] =>
val fAppliedToSri: Function1[Option[User], Response] = f.apply(sri)
val response: Response = fAppliedToSri.apply(optionUser)
return response
}
}
}
}
}

flatMap方法中,出现了函数组合,它与2个参数的函数不同,但在这种情况下是等价的。函数的组合模式比函数的2个参数更灵活,你可以不在同一时刻评估它们。如果你想了解更多关于2个参数的函数和1个参数的2个函数组合之间的转换,请阅读Currying。

最新更新