2015-12-01 11 views
7

Abbiamo qualche codice di corrispondenza del modello in cui ci si aspetterebbe di essere avvisati dal compilatore che la corrispondenza non è esaustiva, ma non ne riceviamo. Ci sono alcuni casi in cui non è possibile eseguire il controllo esaustivo?Controllo di esaustività per la corrispondenza del modello in Scala 2.11

es Il nostro esempio (usando scalactic Good Bad):

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

abbiamo commentato le ultime due righe, ma il compilatore non mettere in guardia e non abbiamo disattivare i controlli.

+1

Potrebbe essere correlato a https://issues.scala-lang.org/browse/SI-7631 (anche se non dovrebbe avere tale effetto di per sé). Potresti provare a spostare le condizioni di guardia all'interno dei rami (ad esempio 'case (Some (Good (modelId)), None) => if (modelId> = 0) ... else ...') e controlla se questo aiuta. –

+0

Grazie è! aggiungilo come risposta e lo accetterei! – longliveenduro

risposta

4

Sembra che la scala spenga il controllo esaustivo se hai qualche guardia nella partita. Il mio compilatore non produce un avvertimento nemmeno su questo:

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

Fintanto che tengo la guardia lì. Ci sono biglietti con le discussioni su questo: https://issues.scala-lang.org/browse/SI-7631 https://issues.scala-lang.org/browse/SI-5365 E sembra che ci sia del lavoro da fare qui, quindi potrebbe migliorare. Il compilatore di Scala non può controllare l'esaustività delle guardie nella maggior parte dei casi, perché è una cosa troppo complessa da fare, ma il tuo caso dimostra sicuramente che può essere migliorato.

+0

Sì, grazie, hai anche ragione. Ma ho già accettato la risposta precedente. Hai una risposta da me però. – longliveenduro

+0

@longliveenduro Il commento di Alexey è stato il primo, non l'ho notato. Quindi va bene :) – Archeg

Problemi correlati