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

return 式を使用して、命令的な用語で考えたりプログラミングしたりします。発生した場合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 に答える