Scala:在for循环中声明val,如果条件

时间:2014-01-28 13:39:37

标签: scala

我是一个scala初学者,并试图了解val在Scala中是如何工作的。我读到vals无法修改。当我执行以下操作时:

for( line <- Source.fromFile(args(0)).getLines() ) {
   val currentLine = line
   println(currentLine)
}

currentLine在每次迭代中都会更新,而我希望它用第一行初始化并保持到最后,或者至少给出某种重新初始化错误。为什么会这样?是否在每次迭代中创建并销毁了val?我的第二个问题:如果在下面的代码中,我想在外面使用x。

if( some condition is satisfied) val x = 2 else val x = 3

到目前为止,我收到了“非常简单的表达式错误”错误。有没有办法在外面使用x?

4 个答案:

答案 0 :(得分:16)

  1. 是的,每次迭代都会创建并销毁val

  2. val x = if(condition) 2 else 3会做你想要的。

  3. 编辑:您可以将2.重写为if(conditon) {val x = 2} else {val x = 3}(使其编译),但这样做无效,因为if不返回任何内容,并且该变量不能在if <之外使用/ p>

答案 1 :(得分:3)

For Loop

您可以将其细分为map操作。

for( line <- Source.fromFile(args(0)).getLines() ) {
   val currentLine = line
   println(currentLine)
}

所以这段代码转换为

Source.fromFile(args(0)).getLines().map( line => block )

block可以是任何表达。在您的情况下block是:

{
   val currentLine = line
   println(currentLine)
}

此处currentLine位于block的本地,并且是为line操作的map的每个值创建的。

如果-ELSE

再次关注也是错误的:

if( some condition is satisfied) val x = 2 else val x = 3

Scala中基本上if-else返回一个值。所以它应该是:

if( condition ) expression1 else expression1

在你的情况下,你可以:

if( condition ) { val x = 2 } else { val x = 3 }

但是,如果您想要使用Java / C ++进行类比,则赋值返回Unit(或void)。所以您可以简单地将if-else的值视为:

val x = if( condition ) { 2 } else { 3 }
// OR
val x = if( condition ) 2 else 3

答案 2 :(得分:2)

除了所说的之外,没有回答提到它:

  1. val可用于每次迭代的垃圾收集(因此无法从下一次循环迭代中访问)。这是因为所谓的scope of variables仅限于scala中的块(与Java相同)。

  2. 正如@Kigyo val x = if(condition) 2 else 3所说,你会做你想做的事,因为你只做一次任务。如果你将val的赋值放入块中,那么这个val的范围就是块,因此不能像你想要的那样使用。

答案 3 :(得分:1)

第一个问题:是的,在每次迭代中都会创建一个新的val

第二个问题:你可以重写它是

 val x =  if (some condition is satisfied)
  2
 else
  3