很多时候,我希望创建一个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!一种选择是相当混乱的:
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我试图避免的明显的替代方案是:
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这样的事情在Scala中是可能的吗?有没有合适的变通办法?如果没有,还有什么语言支持这样的想法呢?
发布于 2012-01-13 11:16:26
因为Scala中的if是一个表达式,也就是说它返回一个值,所以通常你会为你的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
}在块内声明的所有val都不能在其外部使用。
发布于 2012-01-13 11:27:34
您可以使用模式匹配:
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)result包含x * y或x * 2的结果,具体取决于运行的计算,而x根据需要包含data*2+5.4345/2.45的值。
发布于 2012-01-13 22:21:35
你可以为它创建一个作用域...
{
val x = data*2+5.4345/2.45
val y = data/128.4;
if ( x*y < 10)
x * y
else
x * 2
}或者,说得更清楚些,
locally {
val x = data*2+5.4345/2.45
val y = data/128.4;
if ( x*y < 10)
x * y
else
x * 2
}https://stackoverflow.com/questions/8845402
复制相似问题