Scala:在for循环中声明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将执行您想要的

我是一名scala初学者,试图了解val在scala中是如何工作的。我读到VAL不能修改。当我执行以下操作时:

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相同)

  • 正如@Kigyo
    val 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