2014-01-28 39 views
7

我是一名Scala初學者,並試圖瞭解val如何在Scala中工作。我讀到vals不能被修改。當我做到以下幾點:Scala:在for循環中聲明val,條件是

for(line <- Source.fromFile(args(0)).getLines()) { 
    val currentLine = line 
    println(currentLine) 
} 

currentLine在每次迭代更新,但我希望它的第一行進行初始化,並保持到最後,或者至少給某種形式的重新初始化錯誤。這是爲什麼? val是否在每次迭代中創建和銷燬?我的第二個問題:如果在下面的代碼中,我想使用x。

if(some condition is satisfied) val x = 2 else val x = 3 

截至目前,我得到了「非法開始簡單表達式」錯誤。有沒有辦法在外面使用x?

+0

需要說明的是,'val'和'var'之間的區別在於'val'不能被重新分配。 –

+0

請記住,'val currentLine = line'與'currentLine = line'不同。只有後者嘗試爲現有值分配新值。 – KChaloux

回答

12
  1. 是的,val在每次迭代中被創建和銷燬。

  2. val x = if(condition) 2 else 3會做你想做的。

編輯:您可以重寫2. if(conditon) {val x = 2} else {val x = 3}(使它編譯),但什麼都不做,因爲如果不返回任何東西和變量不能外if

0

1日起使用問題:是的,在每次迭代新VAL創建

第二個問題:你可以把它改寫爲

val x = if (some condition is satisfied) 
    2 
else 
    3 
2

For Loop

您可以將其分解爲map操作。

for(line <- Source.fromFile(args(0)).getLines()) { 
    val currentLine = line 
    println(currentLine) 
} 

所以這個代碼變換成

Source.fromFile(args(0)).getLines().map(line => block) 

block可以是任何表達。凡在你的情況block是:

{ 
    val currentLine = line 
    println(currentLine) 
} 

這裏currentLine是本地的block併爲每個給予map操作line值的創建。

的if-else

再下面也是錯誤的:

if(some condition is satisfied) val x = 2 else val x = 3 

本質if-else Scala中返回一個值。因此,它應該是:

if(condition) expression1 else expression1 

在你的情況,你可以這樣:

if(condition) { val x = 2 } else { val x = 3 } 

但是(如果你想使用Java/C++的比喻或void)的分配返回Unit。因此,你可以簡單地採取的if-else值,像這樣:

val x = if(condition) { 2 } else { 3 } 
// OR 
val x = if(condition) 2 else 3 
1

沒有回答所以除了提到它說了什麼:

  1. val,並可用於垃圾收集在每次迭代(因此在下一次循環迭代中不可訪問)。這是由於所謂的scope of variables,它僅限於scala中的塊(與Java相同)。

  2. 正如@Kigyo所述val x = if(condition) 2 else 3會做你想做的事,因爲你只做一次分配。如果你將賦值賦值給塊,那麼這個val的範圍就是塊,因此不能像你想要的那樣使用。

+2

關於(1):如果這只是真的!當執行離開它們的作用域時,編譯器不會用'null'替換引用的本地。偶爾會導致類似記憶泄漏的症狀。 –

+0

好吧,也許我應該改述一下:每次迭代val通常會被銷燬? – benzonico

+0

與「可用於垃圾回收」相比並非「銷燬」 –