0

我想在模式匹配中使用会话值,但由于我的 request.get("profileType") 返回 Option[String] 我不能像在我的代码中那样在模式匹配中使用它。这是我的代码片段。

def editorProfile = Action { implicit request =>
request.session.get("profileType").toString() match {
  case "editor" => {
      request.session.get("userEmail").map {
        userEmail => Ok(html.profile.editorProfile("my profile"))
      }.getOrElse {
        Unauthorized(html.error("Not logged in"))
      }
  }
 }
}

这是错误:

[MatchError: Some(editor) (of class java.lang.String)]

我的问题是。如何在我的模式匹配中使用 session.get 中的 Some(editor)?

4

2 回答 2

2

你打电话toStringOption[String]得到"Some(editor)"。相反,您必须对此进行匹配:

request.session.get("profileType") match {
  case Some("editor") => { /* your code */}
  case _ => /* something else */ 
}

请注意,我添加了 default case _ =>。如果没有它,您可以获得MatchError如果session不包含“profileType”属性或属性有另一个值。

于 2013-03-15T10:59:40.777 回答
2

您可能应该尝试使用 for 理解,因为当您添加更多类似类型的检查时,它可能会更容易扩展。

val email = for {
  profileType <- request.session.get("profileType") if profileType == "editor"
  userEmail <- request.session.get("userEmail")
} yield userEmail

// email is of type Option[String] now, so we do the matching accordingly

email match {
  case m: Some => Ok(html.profile.editorProfile("my profile"))
  case None => Unauthorized(html.error("Not logged in or not an editor."))
}

当然,您可以以更简洁的方式编写所有内容,但作为初学者,更明确并没有什么坏处。

添加:

如果您想稍后使用邮件地址,您可以将其更改为:

email match {
  case Some(address) => Ok(html.profile.editorProfileWithEmail("my profile", address))
  case None => Unauthorized(html.error("Not logged in or not an editor."))
}
于 2013-03-15T12:01:39.457 回答