Scala将函数作为参数传递并有条件地执行

时间:2013-06-03 15:00:38

标签: scala

假设我有一个名为protect的方法的对象。

这应该带有JValue => JValue(非通用参数)的函数。

 def protect(func: (JValue) => JValue) = {
        if (Something.is) {
            InMemoryResponse(Array(), Nil, Nil, 200)
        } else {
            InMemoryResponse(Array(), Nil, Nil, 401)
        }
  }

我现在如何调用函数传递其原始参数?

目标是在响应REST请求之前检查用户会话是否存在。如果没有,则会自动返回401 Forbidden,如下所示。在这种情况下,我想传递Users.getUsers作为参数函数,并将其限制为函数的参数。

所以在protect内,如果Session存在,该函数将执行并显示。

serve {
    case "user" :: limit :: Nil JsonGet _ =>
        AuthorizedReq.protect(json => Users.getUsers(limit))

2 个答案:

答案 0 :(得分:2)

我最终使用了这个:

object AuthorizedReq extends Logger {
    private[this] val error: JValue = ("error" -> "Unauthorized request");
    def protect(func: (JValue) => JValue, json: JValue): JValue = {
        if (LoginSession.is) {
                new OkResponse
                func(json)
            } else {
                new UnauthorizedResponse
                error;
            }
        }
    }
}

结合:

serve {
    case "user" :: limit :: Nil JsonPost json -> _ =>
        for {
            json <- AuthorizedReq.protect(json => Users.getUsers(json), json)
        } yield json: JValue
}

如果用户未通过身份验证,则服务器将使用401进行响应,否则将执行原始功能。引入角色和领域应该很容易。

这取代了Lift的默认身份验证机制,缺少文档。

答案 1 :(得分:0)

据我所知,你实际上将函数Users.getUsers作为参数传递。您正在使用limit参数传递调用此函数的函数。

因为当您创建作为参数传递的匿名函数时,您还会创建一个闭包,limit的值仍然可用于该函数(尽管您不可见)。您应该能够在没有参数的情况下调用func并使其正常工作。