2014-12-30 20 views
6

Ben Scala için biraz yeniyim. Aşağıda benim kodum. Bunu düzeltmek nasılScala uyarı eşleşmesi çok kapsamlı olmayabilir

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

derlerken

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

aşağıdaki uyarıyı almak? Uyarıyı engellemek için kodu yeniden yazmanın bir yolu var mı? (Scala sürüm 2.10.2 kullanıyorum)

cevap

10

desen eşleştirme, sen hesap olmalıdır: Bir Some vaka dahil etmek gerek

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

Teşekkürler. Senin önerdiğini kullanacağım –

+0

Stil için, ben Session.get.getAttr ("foo") eşleşmesi {case null => case _ =>} '. Daha kolay okunabilir. Veya' Opsiyon (...) orElse alt' veya 'Some (Session.get) filtresi (_.getAttr (" foo ") ")! = null) orElse (s => Bazı (s.setAttr (" ", x))) veya benzeri. –

3

Yalnızca None numaralı kasa ile eşleşiyorsanız, Some(something) davasına göre daha doğru bir yol olacaktır. Option(...), None veya Some(_) verebilir, dolayısıyla hata. Bu durumda

sadece olacağını yapmaya çalıştıkları şeye daha iyi bir çözüm:

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) 
    } 
} 
1

tüm olası durumlar için veya "geri dönüş" (case _ => ...) sağlayın. Option, Some veya None olabilir, ancak yalnızca None kasasına karşı eşleşiyorsunuz.

Session.get().getAttribute("player") döndürdüğünde MatchError (özel durum) alırsınız.

Kodunuz bir şey döndürmediği için, match olmadan bunu yeniden yazabilirim ve isEmpty'u kontrol etmeliyim. Bu olsa

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 kontrol daha gerçekten çok farklı değil.

+0

Ama 'Bazı' durumu için bir şey yapmam gerekmiyor. En azından düşündüğüm bu. (Bu, eğer zaten yoksa, oturum nesnesine oyuncu ekler) koduna dayanarak, "Bazılarında ne tür bir çalışma yapılmalıdır?" (Bazı durumlarda) "Bazıları için herhangi bir şey yapmanıza gerek yoksa, –

+1

'case' neden 'Option' kullanıyorsun? –

+0

Sadece bir boş kontrol yapmak için bir nesne yaratıyorsun. –