根据第一个真实条件评估表达式

时间:2013-12-05 12:45:43

标签: javascript scala pattern-matching switch-statement

在javascript中,我们可以这样做:

 switch (true) {
            case a > b:
                expression;
                break;
            case a < b:
                expression;
                break;
            case a == b:
                expression;
                break;
        }

我们可以在Scala中实现这样的功能吗? If表达式并非如此。

我能算出的最大值是:

val a = foo < elem
val b = foo > elem
val c = foo == elem
true match {
  case `a` =>
  case `b` =>
  case `c` =>
}

3 个答案:

答案 0 :(得分:3)

我能想到的最接近的地方:

() match {
  case _ if foo < elem => expression1
  case _ if foo > elem => expression2
  case _ => expression3
}

但这显然不像if / else if / else那样自然。模式匹配很棒,但肯定有一些情况下你最好使用一个好的'if / else块。

答案 1 :(得分:1)

如果您真的喜欢scala并希望重新定义该语言,则可以重新定义&lt;,&gt;和==作为具有unapply方法的对象。然后你可以考虑一个&lt; b作为提取物:

trait Comparator {
    def unapply(t: (Int, Int)): Option[(Int, Int)] = if(compare(t._1, t._2)) Some(t) else None
    val compare: (Int, Int) => Boolean
}
object < extends Comparator {
  val compare = (i: Int, j: Int) => i < j
}
object > extends Comparator {
  val compare = (i: Int, j: Int) => i > j
}
object == extends Comparator {
  val compare = (i: Int, j: Int) => i == j
}

val a = 1
val b = 2
(a, b) match {
  case a < b =>  println(s"$a is less than $b")
  case a > b =>  println(s"$a is greater than $b")
  case a == b => println(s"$a is equal to $b")
}

结果:

"1 is less than 2"

在这种情况下,模式匹配中的a和b是从(a,b)中提取的变量,并且在提取过程中进行计算。

答案 2 :(得分:0)

(a compare b) match { case _ > 0: / case _ < 0 / case _ == 0 }工作吗?这应该适用于任何可以隐式转换为Ordered的东西,并且不需要捕获外部变量。