2013-07-22 57 views
1

如何將模式匹配應用於此代碼?所以它會看起來像代碼編寫的函數式:如何在這種情況下應用模式匹配

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

方法check0, check1, check2, check3所有收益Option[Int]

+0

程式碼中每一個支柱是不必要的! –

回答

6

不是一個模式匹配,但應該做的伎倆:

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

否則容易的方法定義爲Option。當選項被定義時,它自己返回一個選項,否則它會嘗試一個選擇。

+3

你最終需要orElse None嗎? –

+0

@JensSchauder好吧,是的,它有點多餘 –

1

如何:

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

不是說這是最簡單的解決方案,但真正的功能:

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

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