2013-07-22 5 views
1

Comment appliquer une correspondance de modèle à ce code? Donc, il ressemble à un code écrit dans un style fonctionnel:Comment appliquer la correspondance de modèle dans ce cas

def getIndex(i: Int): Option[Int] = { 
    if (check0(i) == Some) { 
     check0(i) 
    } 
    else if (check1(i) == Some) { 
     check1(i) 
    } 
    else if (check2(i) == Some) { 
     check2(i) 
    } 
    else if (check3(i) == Some) { 
     check3(i) 
    } 
    else { 
     None 
    } 
    } 

Méthodes check0, check1, check2, check3 tous les retours Option[Int]

+0

Chaque croisillon unique dans votre extrait est inutile! –

Répondre

6

Pas un ltrage, mais devrait faire l'affaire:

checkTop(clickedIndex) orElse 
checkBottom(clickedIndex) orElse 
checkLeft(clickedIndex) orElse 
checkRight(clickedIndex) 

OrElse est une méthode définie pour Option. Lorsque l'option est définie, elle renvoie une option elle-même, sinon elle essaie une alternative.

+3

Avez-vous besoin de l'orElse Aucun à la fin? –

+0

@JensSchauder bien, oui, c'est un peu redondant –

1

Que diriez-vous ceci:

def getIndex(i: Int) = check0(i) match { 
    case None => check1(i) match { 
    case None => check2(i) match { 
     case None => check(3) 
     case some2 => some2 
    } 
    case some1 => some1 
    } 
    case some0 => some0 
} 
1

ne dis pas que c'est la solution la plus simple, mais vraiment fonctionnelle:

def multiCheck(checks: ((Int) => Option[Int])*)(i: Int) = 
    checks.foldLeft[Option[Int]](None)(_ orElse _(i)) 

multiCheck(check0, check1, check2, check3)(2) 
Questions connexes