2014-12-30 8 views
6

मैं स्कैला के लिए कुछ नया हूं। मेरा कोड निम्नलिखित है।स्कैला चेतावनी मैच पूर्ण नहीं हो सकता

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 { 
     ^

मैं इसे ठीक करना कैसे संकलन निम्न चेतावनी मिल सकता है? चेतावनी से बचने के लिए कोड को फिर से लिखने का कोई तरीका है? (मैं स्कैला संस्करण 2.10.2 का उपयोग कर रहा हूं)

उत्तर

10

जब पैटर्न मिलान, आप होनी चाहिए, सभी संभावित मामलों के लिए या "फॉलबैक" प्रदान करें (केस _ => ...)। OptionSome या 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 जाँच से अलग नहीं है।

+0

धन्यवाद। मैं आपके द्वारा सुझाए गए –

+0

का उपयोग करूंगा, मैं 'सत्र.get.getAttr' ("foo") मैच {case null => case _ =>} 'पढ़ने के लिए आसान है। या 'विकल्प (...) या alt alt' या 'कुछ (सत्र .get) फ़िल्टर (_.getAttr (" foo ")! = शून्य) orElse (एस => कुछ (s.setAttr (" ", x)))' या इसी तरह के। –

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

लेकिन मुझे 'कुछ' मामले के लिए कुछ भी करने की आवश्यकता नहीं है। कम से कम यही मुझे लगता है। कोड के आधार पर, (जो खिलाड़ी को सत्र वस्तु में जोड़ता है यदि यह पहले से नहीं है) 'कुछ (__ 'केस? –

+1

में किस तरह का काम किया जाना चाहिए यदि आपको कुछ के लिए कुछ करने की आवश्यकता नहीं है 'मामला आप' विकल्प' का उपयोग क्यों कर रहे हैं? –

+0

आप केवल अनावश्यक रूप से एक ऑब्जेक्ट बनाने के लिए अनावश्यक रूप से एक ऑब्जेक्ट बना रहे हैं। –

संबंधित मुद्दे