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]

4

3 回答 3

6

不是模式匹配,但应该可以解决问题:

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

orElse 是为Option定义的方法。定义选项时,它会返回一个选项本身,否则它会尝试替代。

于 2013-07-22T10:37:48.517 回答
1

并不是说这是最简单的解决方案,而是真正实用:

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

multiCheck(check0, check1, check2, check3)(2)
于 2013-07-22T15:48:00.103 回答
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
}
于 2013-07-22T15:24:32.960 回答