2015-12-01 6 views
7

में पैटर्न मिलान के लिए निकास जांच हमारे पास कुछ पैटर्न मिलान कोड है जहां हम संकलक द्वारा चेतावनी दी जाने की उम्मीद करेंगे कि मैच संपूर्ण नहीं है, लेकिन हमें कोई नहीं मिलता है। क्या ऐसे कुछ मामले हैं जहां थकावट की जांच नहीं की जा सकती है?स्कैला 2.11

उदा हमारे उदाहरण (का उपयोग कर scalactic अच्छा + बुरा):

(maybeModelIdOrFailure, maybeMake) match { 

    case (Some(Good(modelId)), Some(makeId)) if modelId >= 0 && taxonomyService.isValidModel(makeId, modelId) => 
     Good(Some(MakeModelParameters(makeId, Some(modelId), modelLineId = None, index))) 

    case (Some(Good(modelLineId)), Some(makeId)) if modelLineId < 0 && taxonomyService.isValidModelLine(makeId, -1 * modelLineId) => 
     Good(Some(MakeModelParameters(makeId, modelId = None, modelLineId = Some(-1 * modelLineId), index))) 

    case (Some(Good(modelOrModelLineId)), Some(makeId)) => 
     Bad(One(IdNotFound(modelIdKeyName, modelOrModelLineId))) 

    case (Some(Good(modelId)), None) if modelId >= 0 => 
     Bad(One(IdInvalid(modelIdKeyName, "Model Id without Make Id"))) 

    case (Some(Good(modelLineId)), None) if modelLineId < 0 => 
     Bad(One(IdInvalid(modelIdKeyName, "Model Line Id without Make Id"))) 

    case (None, Some(makeId)) => Good(Some(MakeModelParameters(makeId, None, None, index))) 

    // case (None, None) => Good(None) 

    // case (Some(Bad(invalidParams)), _) => Bad(One(invalidParams)) 
    } 

हम अंतिम दो पंक्तियों टिप्पणी की है, लेकिन संकलक चेतावनी दी है नहीं है और हम किसी भी जांचों को अक्षम नहीं किया।

+1

यह https://issues.scala-lang.org/browse/SI-7631 से संबंधित हो सकता है (हालांकि इसे स्वयं से ऐसा प्रभाव नहीं होना चाहिए)। आप शाखाओं के अंदर गार्ड की स्थिति को स्थानांतरित करने का प्रयास कर सकते हैं (उदा। 'केस (कुछ (अच्छा (मॉडल आईडी)), कोई नहीं) => यदि (मॉडल आईडी> = 0) ... और ...') और यह जांचने में जांच करता है या नहीं। –

+0

धन्यवाद यह है! इसे एक उत्तर के रूप में जोड़ें और मैं इसे स्वीकार करूंगा! – longliveenduro

उत्तर

6

Jason Zaugg's comment on SI-9232 से ऐसा लगता है कि वर्तमान में गार्ड केवल थकावट जांच (या लगभग इतना) अक्षम करते हैं। यदि यही कारण है, तो शाखाओं के अंदर गार्ड की स्थिति को स्थानांतरित करना (उदा। case (Some(Good(modelId)), None) => if (modelId >= 0) ... else ...) सहायता करनी चाहिए। अन्य संबंधित मुद्दे: https://issues.scala-lang.org/browse/SI-5365, https://issues.scala-lang.org/browse/SI-7631

4

ऐसा लगता है कि स्कैला सिर्फ मैच में कोई गार्ड है, तो केवल थकावट जांच को बंद कर दें। मेरा कंपाइलर इस पर भी चेतावनी नहीं देता है:

def tt(s: Option[Int]) = s match { 
    case Some(x) if x > 0 => println(x) 
} 

जब तक मैं वहां गार्ड रखता हूं। इस पर चर्चा के साथ टिकट हैं: https://issues.scala-lang.org/browse/SI-7631 https://issues.scala-lang.org/browse/SI-5365 और ऐसा लगता है कि यहां कुछ काम किया जाना है, इसलिए यह बेहतर हो सकता है। स्कैला कंपाइलर ज्यादातर मामलों में गार्ड थकावट की जांच नहीं कर सकता है, क्योंकि यह करना बहुत जटिल बात है, लेकिन आपका मामला निश्चित रूप से साबित करता है कि इसे बेहतर किया जा सकता है।

+0

हाँ धन्यवाद आप भी सही हैं। लेकिन मैंने पहले ही जवाब स्वीकार कर लिया है। यद्यपि आप मुझसे एक उपरोक्त मिला है। – longliveenduro

+0

@longliveenduro एलेक्सी की टिप्पणी पहली थी, मैंने इसे नोटिस नहीं किया। तो यह ठीक है :) – Archeg

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