我想在模式匹配中使用会话值但是因为我的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(编辑器)?
答案 0 :(得分:2)
您在toString
上致电Option[String]
并获取"Some(editor)"
。相反,你必须匹配:
request.session.get("profileType") match {
case Some("editor") => { /* your code */}
case _ => /* something else */
}
请注意,我添加了默认案例_ =>
。如果没有它,如果MatchError
不包含“profileType”属性或属性具有其他值,则可以获得session
。
答案 1 :(得分:2)
您应该尝试使用for for understanding,因为当您添加更多类似类型的检查时,它可能会更容易扩展。
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."))
}