如何在Scala中编写限制函数?

Chr*_*ris 4 scala return function return-value limit

在想知道我的第一个Scala应用程序中的某些错误后,我发现我的限制功能根本不起作用......

所以这是我的第一次尝试:

  def limit(x : Double, min: Double, max : Double) = {
    if (x < min) min;
    if (x > max) max;
    x;
  }
Run Code Online (Sandbox Code Playgroud)

它总是回来x!

我的第二次尝试看起来像这样:

  def limit(x : Double, min: Double, max : Double) : Double = {
    if (x < min) return min;
    if (x > max) return max;
    x;
  }
Run Code Online (Sandbox Code Playgroud)

它起作用了.

所以我的问题:为什么是min;max;第一个示例基本无操作,并且x;是不?我的第二次尝试是好Scala吗?

Nat*_*rom 14

甚至:

val limited = lower max x min upper
Run Code Online (Sandbox Code Playgroud)

max并且min具有相同的优先级和关联,因此不需要任何parens

  • 对于可能感到困惑的人来说,`lower`是具有下限的变量,`upper`是具有上限的变量,`x`是变量被限制,并且`max`和`min`是方法. Int类. (4认同)

Jes*_*per 8

我写了一个通用版本(我已经调用过clamp),看起来像这样:

// NOTE: This will still do some boxing and unboxing because Ordering / Ordered is not @specialized.
@inline def clamp[@specialized(Int, Double) T : Ordering](value: T, low: T, high: T): T = {
  import Ordered._
  if (value < low) low else if (value > high) high else value
}
Run Code Online (Sandbox Code Playgroud)

在Scala中,表达式的结果是该表达式中提到的最后一个值.第一次尝试中的if表达式的结果将被丢弃,因为每个if-expression后跟另一个表达式.你的第二次尝试是可以的,但你可以if ... else像我的例子那样做.你可以这样写你的:

def limit(x: Double, min: Double, max: Double): Double =
  if (x < min) min else if (x > max) max else x
Run Code Online (Sandbox Code Playgroud)


ten*_*shi 7

如果未return明确指定,则返回值是最后一个表达式的结果.在您的第一个示例中,您的最后一个表达式是x;,因此在任何情况下都会返回.如果要返回不同的值,则可以使用if/else if/else:

def limit(x : Double, min: Double, max : Double) = 
    if (x < min) min
    else if (x > max) max
    else x
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将if/else if/else被视为返回单个值的单个表达式.

您也可以使用这样的模式匹配(它也是单个表达式):

def limit(x : Double, min: Double, max : Double) = x match {
    case x if x < min => min
    case x if x > max => max
    case _ => x
}
Run Code Online (Sandbox Code Playgroud)

我不认为你的第二个例子可以被描述为"好斯卡拉".在这种简单的情况下,它只会使整个事情变得复杂并且有3个回报点(而不是单点回报).它还增加了更多不必要的样板.