2017-05-25 35 views
2

我是Scala初學者,開始閱讀「Programming in Scala」。我遇到以下代碼。scala爲什麼每個迭代參數都是val而不是var for循環

for (arg <- args) 
println(arg) 

在書上面說的arg是類型VAL,而不是VAR的。爲什麼如此。

根據我對每次迭代的理解,arg的值會發生變化,因爲它每次循環時都保持新值。

以下是我的問題

  1. 爲什麼ARG VAL,而不是無功?
  2. 按照斯卡拉如果是VAL我們無法改變的值(因爲它在Scala是最後的)
  3. 也將其創建的每個迭代多個對象以及如何 對象循環後銷燬?

另外我知道在斯卡拉var和val之間的區別。我已經通過這個鏈接。 What is the difference between a var and val definition in Scala?

回答

7

在Scala中,一個用於理解超過foreachmapflatMapfilter組合程序語法糖。當你寫:

for (arg <- args) 

編譯器重新寫入:

args.foreach { } 

由於foreach引入了一個新的價值爲每個元素,你不實際上重新分配arg任何東西:

args.foreach { arg => // } 

例如,如果我們看看執行List.foreach

@inline final override def foreach[U](f: A => U) { 
    var these = this 
    while (!these.isEmpty) { 
    f(these.head) 
    these = these.tail 
    } 
} 

你看到thesevar正在被重新分配爲您遍歷列表,所以內部 Scala的集合庫保持一個可變的參考名單,但來自外部的每個值作爲調用者通過f(these.head)向您公開的A類型是不可變的,因此實際上並不需要重新分配對像C樣式for循環中的值的引用。