scala中for循环中val的不期望行为

时间:2016-11-29 07:38:37

标签: scala

我在Scala代码下执行它并且它成功执行而没有任何编译时错误,并且还给出了下面给出的输出:

 val a = 0;
 val numList = List(1,2,3,4,5,6);

 // for loop execution with a collection
 for( a <- numList ){
     println( "Value of a: " + a );
 }

输出:

Value of a: 1                                                                                                                                                                   
Value of a: 2                                                                                                                                                                   
Value of a: 3                                                                                                                                                                   
Value of a: 4                                                                                                                                                                   
Value of a: 5                                                                                                                                                                   
Value of a: 6

我的问题是,如果a的类型为val,那么在for循环中,为什​​么a的值会在循环的每次迭代中发生变化{{1}接受那些改变的值和打印?

2 个答案:

答案 0 :(得分:2)

a循环中使用的for是一个不同的变量,它会遮蔽外部a

查看两个变量不同的一种方法是在循环后打印a的值。它仍包含初始值(在您的情况下为0)。

 val a = 0;
 val numList = List(1,2,3,4,5,6);

 // for loop execution with a collection
 for( a <- numList ){
     println( "Value of a: " + a );
 }

 println("After the loop, a = " + a)

输出:

Value of a: 1                                                                                                                                                                   
Value of a: 2                                                                                                                                                                   
Value of a: 3                                                                                                                                                                   
Value of a: 4                                                                                                                                                                   
Value of a: 5                                                                                                                                                                   
Value of a: 6
After the loop, a = 0

请注意,内部a也是val(而不是var)。在每次迭代中,使用val元素初始化名为a的新numList

答案 1 :(得分:0)

val a = 0;中用于理解的a不同中用于理解的变量是临时变量。您可以通过检查a

的哈希码来确认
    val a = 9;
    val numList = List(1, 2, 3, 4, 5, 6);

    println(a.## + " hash start")
    // for loop execution with a collection
    for (a <- numList) {
      println("Value of a: " + a + " and  \t hash "+a.##);


    }
  println(a.## + " hash end")
  

9哈希开始

     

a的值:1和散列1

     

a:2和hash 2

的值      

a:3和hash 3的值

     

a:4和hash 4

的值      

a的值:5和哈希5

     

a的值:6和hash 6

     

9哈希结束

从上面的输出中,您可以看到哈希开始和结束保持相同9