首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If语句作用域的变量

If语句作用域的变量
EN

Stack Overflow用户
提问于 2012-01-13 11:06:40
回答 3查看 6.8K关注 0票数 9

很多时候,我希望创建一个if语句作用域的变量。一些计算只涉及一个特定的'if‘语句--用临时变量污染外部作用域是很糟糕的。

我想做的是:

代码语言:javascript
复制
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!

一种选择是相当混乱的:

代码语言:javascript
复制
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

我试图避免的明显的替代方案是:

代码语言:javascript
复制
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中是可能的吗?有没有合适的变通办法?如果没有,还有什么语言支持这样的想法呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-13 11:16:26

因为Scala中的if是一个表达式,也就是说它返回一个值,所以通常你会为你的if表达式的结果设置一些值。所以你的第三个选择很好:把它放在一个代码块中,即

代码语言:javascript
复制
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都不能在其外部使用。

票数 20
EN

Stack Overflow用户

发布于 2012-01-13 11:27:34

您可以使用模式匹配:

代码语言:javascript
复制
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 * yx * 2的结果,具体取决于运行的计算,而x根据需要包含data*2+5.4345/2.45的值。

票数 6
EN

Stack Overflow用户

发布于 2012-01-13 22:21:35

你可以为它创建一个作用域...

代码语言:javascript
复制
{
  val x = data*2+5.4345/2.45
  val y = data/128.4;
  if ( x*y < 10) 
    x * y
  else
    x * 2
}

或者,说得更清楚些,

代码语言:javascript
复制
locally {
  val x = data*2+5.4345/2.45
  val y = data/128.4;
  if ( x*y < 10) 
    x * y
  else
    x * 2
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8845402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档