我是Scala初学者并开始经历“Scala编程” . 我遇到了以下代码 .
for (arg <- args)
println(arg)
在书中它说 arg is of type val and not var . 为什么会如此 .
根据我对每次迭代的理解,arg的值会发生变化,因为每次循环时它都会保持新的值 .
以下是我的问题
-
为什么 arg val而不是var?
-
根据Scala,如果它是 val ,我们无法更改值(因为它在Scala中是最终的)
-
它还会为每次迭代创建多个对象以及循环后对象如何被销毁?
我也知道scala中var和val之间的区别 . 我已经看过这个链接 . What is the difference between a var and val definition in Scala?
1 回答
在Scala中,理解是
foreach
,map
,flatMap
和filter
组合器的语法糖 . 当你写:编译器重写为:
由于
foreach
为每个元素引入了一个新值,因此您实际上不会将arg
重新分配给任何内容:例如,如果我们看一下
List.foreach
的实现:您看到
these
是these
,在您迭代列表时会重新分配,因此Scala集合库内部保留对列表的可变引用,但是从外部通过f(these.head)
将每个值A
的值暴露给您作为调用者是不可变的,因此实际上不需要重新分配对C语言for循环中的值的引用 .