Scala:在for循环中声明val,如果条件为
我是一名scala初学者,试图了解val在scala中是如何工作的。我读到VAL不能修改。当我执行以下操作时:Scala:在for循环中声明val,如果条件为,scala,Scala,我是一名scala初学者,试图了解val在scala中是如何工作的。我读到VAL不能修改。当我执行以下操作时: for( line <- Source.fromFile(args(0)).getLines() ) { val currentLine = line println(currentLine) } 现在,我得到了一个“简单表达式的非法开始”错误。如果有,有没有办法在外面使用x 是的,val在每次迭代中创建和销毁 val x=if(条件)2 else 3将执行您想要的
for( line <- Source.fromFile(args(0)).getLines() ) {
val currentLine = line
println(currentLine)
}
现在,我得到了一个“简单表达式的非法开始”错误。如果有,有没有办法在外面使用x
val
在每次迭代中创建和销毁val x=if(条件)2 else 3
将执行您想要的操作编辑:你可以重写2。到
if(conditon){val x=2}else{val x=3}
(使其可编译),但这将不起任何作用,因为if不返回任何内容,并且变量不能在if
之外使用。第一个问题:是的,在每次迭代中都会创建一个新的val
第二个问题:你可以重写它
val x = if (some condition is satisfied)
2
else
3
用于循环 您可以将其分解为
map
操作
for( line <- Source.fromFile(args(0)).getLines() ) {
val currentLine = line
println(currentLine)
}
块
可以是任何表达式。在您的情况下,块
是:
{
val currentLine = line
println(currentLine)
}
这里的currentLine
是块的本地并为line
的每个值创建,这些值是为map
操作指定的
for( line <- Source.fromFile(args(0)).getLines() ) {
val currentLine = line
println(currentLine)
}
如果有其他情况
同样,以下也是错误的:
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++进行类比。因此,您可以简单地取的值,如果其他值为,如下所示:
val x = if( condition ) { 2 } else { 3 }
// OR
val x = if( condition ) 2 else 3
除了所说的以外,没有人提到:
val
可用于每次迭代的垃圾收集(因此无法从下一次循环迭代访问)。这是因为变量的范围被称为,
,它仅限于scala中的块(与Java相同)
正如@Kigyoval x=if(条件)2 else 3
所述,它会做你想做的事情,因为你只做一次赋值。如果将分配给val的内容放入块中,则此val的范围就是块,因此不能像您希望的那样使用
关于(1):如果那是真的就好了!当执行离开引用局部变量的作用域时,编译器不会将引用局部变量替换为null
。这偶尔会导致内存泄漏的症状。好吧,也许我应该重新表述一下:val通常在每次迭代中都会被销毁?与其说是“销毁”,不如说是针对注释编辑的“可用于垃圾收集”。@KevinWright:重点是,它不会被置空,所以在方法返回之前它不可用于GC。最有可能咬到你的地方是在非尾部递归方法中。val
和var
之间的区别在于val
不能被重新分配。记住val currentLine=line
与currentLine=line
是不同的。只有后者尝试将新值指定给现有值。
val x = if( condition ) { 2 } else { 3 }
// OR
val x = if( condition ) 2 else 3