我是一个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?
答案 0 :(得分:16)
是的,每次迭代都会创建并销毁val
。
val x = if(condition) 2 else 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)
除了所说的之外,没有回答提到它:
val
可用于每次迭代的垃圾收集(因此无法从下一次循环迭代中访问)。这是因为所谓的scope of variables
仅限于scala中的块(与Java相同)。
正如@Kigyo val x = if(condition) 2 else 3
所说,你会做你想做的事,因为你只做一次任务。如果你将val的赋值放入块中,那么这个val的范围就是块,因此不能像你想要的那样使用。
答案 3 :(得分:1)
第一个问题:是的,在每次迭代中都会创建一个新的val
第二个问题:你可以重写它是
val x = if (some condition is satisfied)
2
else
3