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
我写了一个通用版本(我已经调用过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)
如果未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个回报点(而不是单点回报).它还增加了更多不必要的样板.