2014-12-30 17 views
6

Jestem trochę nowy w Scali. Oto mój kod.Ostrzeżenie Scala może nie być wyczerpujące.

Option(Session.get().getAttribute("player")) match { 
    case None => { 
    val player = new Player(user.getEmail, user.getNickname).createOrGet 
    Session.get().setAttribute("player", player) 
    } 
} 

otrzymuję następujące ostrzeżenie przy kompilacji

Warning:(35, 11) match may not be exhaustive. 
It would fail on the following input: Some(_) 
    Option(Session.get().getAttribute("player")) match { 
     ^

Jak mogę rozwiązać ten problem? Czy istnieje sposób na przepisanie kodu w celu uniknięcia ostrzeżenia? (Używam Scala w wersji 2.10.2)

Odpowiedz

10

podczas dopasowywania wzorca, należy konta we wszystkich możliwych przypadkach lub podaj "rezerwę" (case _ => ...). Option może być Some lub None, ale pasujesz tylko do przypadku None.

Jeśli Session.get().getAttribute("player") powrócił Some(player) co można uzyskać MatchError (wyjątek).

Ponieważ twój kod wydaje się nie zwracać niczego, chciałbym napisać to ponownie bez numeru match i po prostu sprawdzić isEmpty.

if(Option(Session.get().getAttribute("player")).isEmpty) { 
    val player = new Player(user.getEmail, user.getNickname).createOrGet 
    Session.get().setAttribute("player", player) 
} 

Chociaż tak naprawdę niewiele różni się od sprawdzania Session.get().getAttribute("player") == null.

+0

Dzięki. Wykorzystam to co zasugerowałeś –

+0

Dla stylu, chciałbym 'Session.get.getAttr ("foo") mecz {case null => case _ =>} '. Łatwiejszy do odczytania lub' Option (...) lubElse alt'. Lub 'Some (Session.get) filter (_.getAttr (" foo ")! = null) orElse (s => Some (s.setAttr (" ", x))) lub podobnie. –

3

Dopasowujesz tylko przypadek None, bardziej poprawnym sposobem byłoby dopasowanie również do przypadku Some(something). Option(...) może przynieść None lub Some(_), stąd błąd.

W tym przypadku lepszym rozwiązaniem, co chce zrobić, byłoby po prostu:

if(Session.get().getAttribute("player") == null){ 
    val player = new Player(user.getEmail, user.getNickname).createOrGet 
    Session.get().setAttribute("player", player) 
} 
1

Musisz zawierać Some sprawy:

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) 
    } 
} 
+0

Ale nie muszę robić nic dla przypadku "Some". Przynajmniej tak myślę. Opierając się na kodzie (który dodaje gracza do obiektu sesji, jeśli jeszcze go tam nie ma), jakiego rodzaju pracę należy wykonać w 'Some (__' case? –

+1

Jeśli nie musisz robić nic dla 'Some 'case, dlaczego używasz' Opcji' w ogóle? –

+0

Po prostu niepotrzebnie tworzysz obiekt do sprawdzenia zerowego –

Powiązane problemy