我有一个具有复杂参数类型的IsAuthenticated方法(我从play2的zentasks示例中复制了它):

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


为了使用它,我的动作是:

def delete(id:String) = IsAuthenticated { email => request =>
   ...
}


您可以看到如果不需要,我必须声明email事件。我可以改用_

def delete(id:String) = IsAuthenticated { _ => _ =>
   ...
}


但是_ => _ =>仍然很无聊。

如何重构该方法以使其使用更简单?例如如果不需要emailrequest,则可以:

def delete(id:String) = IsAuthenticated {
   ...
}


如果我只需要request,则可以:

def delete(id:String) = IsAuthenticated { request =>
   ...
}


如果我需要email,则将它们全部声明:

def delete(id:String) = IsAuthenticated { email => request =>
   ...
}

最佳答案

您可以重载IsAuthenticated以提供所需的不同口味。例如:

def IsAuthenticated(result: => Result) = IsAuthenticated { _ => _ => result }


然后可以按以下方式使用它:

def delete(id:String) = IsAuthenticated {
   ...
}

关于scala - 如何重构“IsAuthenticated”方法以提供更好的API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10082977/

10-09 01:58