for(counter <- 1 to 10) println(counter)
什么类型的变量计数器? var或val。
答案是Val。现在显而易见的问题是,如果是val,那么输出如何是0,...,9。这意味着&#34; counter&#34;每次迭代都会更改变量,即每次将计数器重新分配给不同的值。
&#34;&#34;计数器的价值&#34;每次迭代都会改变变量&#34; - 对 &#34;计数器每次重新分配给不同的值&#34; - 错误
糟糕。这怎么可能?让我们看看JVM是如何工作的(对于scala和java)
x = new Fruit(&#34; Apple&#34;)(Fruit是一个类,有一个名为name的属性)
现在我如何获得x的新值,有两种方法。要理解我们在创建对象时会谈论内存。 在这种情况下,对象将在堆内存中创建,其值为&#34; Apple&#34;,并且地址为&#34; xxxx&#34;。 x将在堆栈中具有值&#34; xxx&#34;。现在,同样的对象也可以被其他对象引用,例如y = x。因此两者都指向具有价值的同一物体&#34; Apple&#34;。 现在我创建一个新对象z = new String(&#34; Banana&#34;)。
获取x的新值
如果x是val(java中的final),那么方式2是不可能的,但方式1是可以的。所以结论是如果你声明一个val或final(在java中)那么你就不能将ref重新赋值为新的ref,但是可以修改指向的对象。 ref的值(&#34; xxx&#34;)如果是val则不能改变。
for(counter <- 1 to 10) println(counter)
这里&#34;柜台&#34;是val,所以counter不会重新赋值给新值,但每次都会修改counter指向的对象。
另外&#34; FOR&#34;在scala中,表达式不是声明。不同之处在于.expression总是返回一些东西,但是语句永远不会返回任何东西。(而scala中的while和do-while是语句)
如果有人有任何其他意见,请告诉我
答案 0 :(得分:2)
答案是for
只是foreach高阶函数的语法糖。
首先是什么1 to 10
?好的,它是scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
。
for
实际上是从1到10调用Range。
它与
Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).foreach(count => println(count))
没有赋值给val或var,有更高阶函数应用于Range集合的每个元素。我们可以说不可变范围的每个元素都是val - 是的,因此计数也是val。
当我们对foreach进行计数时根本没有任何赋值,让我们看看foreach在Range上的定义:
def foreach[U](f: Int => U): Unit
foreach接受函数作为参数,参数需要是具有Int类型参数且不返回任何内容的函数,因此这里的count只是一个参数名称,参数在scala中默认为val