模式匹配功能

时间:2012-11-15 18:50:31

标签: scala syntax pattern-matching

在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链。是否有正确的语法来做我正在尝试的事情?

2 个答案:

答案 0 :(得分: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))。)

答案 1 :(得分: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

即使可以使用警卫,我也认为在这种情况下使用匹配语句并不值得。