0

在 Scala 中玩耍时,我遇到了一些我认为应该是可能的事情,但我不知道该怎么做。

我正在返回一个受给定最小值/最大值限制的值。使用 if-else 语句,函数将如下所示:

def set(n: Int, min: Int, max: Int): Int = 
{
  if (n < min) return min
  if (n > max) return max
  return n
}

我想知道是否可以通过模式匹配(优雅地)做到这一点。我尝试了以下方法,但它在语法上不正确:

def set(n: Int, min: Int, max: Int): Int = n match 
{
  case (n < min) => min
  case (n > max) => max
  case _ => n
}

我认为有一种方法可以通过混合 case 和 if 语句来做到这一点,但是当我这样做的时候,我还不如只使用标准的 if/else 链。是否有正确的语法来做我正在尝试的事情?

4

2 回答 2

10

模式匹配有效,但不太优雅:

def set(n: Int, min: Int, max: Int) = n match {
  case _ if n < min => min
  case _ if n > max => max
  case _ => n
}

因为:

def set(n: Int, min: Int, max: Int) = if (n < min) min else if (n > max) max else n

(或者如果你喜欢换行符:

def set(n: Int, min: Int, max: Int) = {
  if (n < min) min
  else if (n > max) max
  else n
}

)

不需要退货。

(也不要忘记math.min(max,math.max(min,n))。)

于 2012-11-15T18:57:11.557 回答
1

使用您正在思考/编程的命令式返回表达式。如果this发生,则返回that。在 Scala 中,if 是一个类型化的表达式:

val x = if (cond) v1 else v2

其中 x 将是最具体的类型,它是 v1 和 v2 的超类型。

因此,您可以将表达式写为:

def bound(n:Int, max:Int, min:Int) = if (n < min) min else if (n>max) max else n

即使可以使用警卫来完成,在这种情况下我也看不到使用 match 语句的价值。

于 2012-11-15T19:05:57.930 回答