通常我都希望创建作用于if语句的变量.有些计算只涉及特定的"if"语句 - 用临时变量污染外部范围.
我想做什么:
val data = (whatever)
if (val x = data*2+5.4345/2.45; val y = data/128.4; x*y < 10)
x * y
else
x * 2
println(x) //ERROR!
Run Code Online (Sandbox Code Playgroud)
一种选择是相当混乱:
val data = (whatever)
if (data*2+5.4345/2.45*data/128.4 < 10)
data*2+5.4345/2.45*data/128.4
else
data*2+5.4345/2.45 * 2
Run Code Online (Sandbox Code Playgroud)
我试图避免的明显替代方案:
val data = (whatever)
val x = data*2+5.4345/2.45
val y = data/128.4
if (x*y < 10)
x*y
else
x * 2
println(x) //OK
Run Code Online (Sandbox Code Playgroud)
在Scala中这样的事情可能吗?有一个体面的解决方法吗?如果没有,其他语言支持这样的想法?
Lui*_*hys 20
因为if在Scala中是一个表达式,即它返回一个值,通常你会为if表达式的结果设置一些值.所以你的第三种选择就好了:把它放在一个代码块中,即
val data = (whatever)
val myValue = {
val x = data*2+5.4345/2.45
val y = data/128.4
if (x*y < 10)
x*y
else
x * 2
}
Run Code Online (Sandbox Code Playgroud)
val在区块内宣布的所有s 都不在其外部.
您可以使用模式匹配:
val data = 123
val (result, x) = (data*2+5.4345/2.45, data/128.4) match {
case (x, y) if x * y < 10 => (x * y, x)
case (x, _) => (x * 2, x)
}
println(x)
Run Code Online (Sandbox Code Playgroud)
result包含x * y或的结果x * 2,取决于运行的计算,并x包含data*2+5.4345/2.45所需的值.