我对Scala有点新鲜。以下是我的代码。
Option(Session.get().getAttribute("player")) match {
case None => {
val player = new Player(user.getEmail, user.getNickname).createOrGet
Session.get().setAttribute("player", player)
}
}
编译时我收到以下警告
Warning:(35, 11) match may not be exhaustive.
It would fail on the following input: Some(_)
Option(Session.get().getAttribute("player")) match {
^
我该如何解决这个问题?有没有办法重写代码以避免警告?(我使用的是Scala版本2.10.2)
答案 0 :(得分:10)
在模式匹配时,您应考虑所有可能的情况或提供"后备" (case _ => ...)。 Option
可以是Some
或None
,但您只能与None
案例进行匹配。
如果Session.get().getAttribute("player")
返回Some(player)
,您将获得MatchError
(例外)。
由于您的代码似乎没有返回任何内容,我会在没有match
的情况下重新编写此代码,只需检查isEmpty
。
if(Option(Session.get().getAttribute("player")).isEmpty) {
val player = new Player(user.getEmail, user.getNickname).createOrGet
Session.get().setAttribute("player", player)
}
虽然这与检查Session.get().getAttribute("player") == null
非常不同。
答案 1 :(得分:3)
您只匹配案例None
,更正确的方法是匹配Some(something)
案例。 Option(...)
可能会产生None
或Some(_)
,因此会出错。
在这种情况下,您尝试做的更好的解决方案就是:
if(Session.get().getAttribute("player") == null){
val player = new Player(user.getEmail, user.getNickname).createOrGet
Session.get().setAttribute("player", player)
}
答案 2 :(得分:1)
您需要包含Some
案例:
Option(Session.get().getAttribute("player")) match {
case Some(value) => // do something here
case None => {
val player = new Player(user.getEmail, user.getNickname).createOrGet
Session.get().setAttribute("player", player)
}
}