2012-09-24 31 views
19

我階的新的學習能力,我試圖運行此示例代碼斯卡拉怎麼寫,如果其他

def isLast(c: Int, r: Int):Int ={ 
    if(r == 1) 
    { 
    return 1; 
    } 

    else if (r == c){ 
    return 1 
    } 
    } 

但它給我的編譯時錯誤,說

Multiple markers at this line 
- type mismatch; found : Unit required: Int 
- type mismatch; found : Unit required: Int 

請幫助我,也建議我一些學習Scala的好網站。

+2

這是啓動Scala的好地方。 http://twitter.github.com/scala_school/ –

回答

26

首先,讓我們來收拾你的代碼一點點:

def isLast(c: Int, r: Int):Int = { 
    if(r == 1) 
    return 1 
    else if (r == c) 
    return 1 
    // but what about when r is neither 1 nor c ?? 
} 

所以你告訴斯卡拉,如果r爲1,則返回1,如果r == c,返回1。這很好。但是如果你想要的方法返回一個Int,它必須返回一個每個的情況。因此,斯卡拉抱怨,因爲它不知道當r既不是1也不是c時返回Int。

修復的方法是添加一個else子句,而不是返回其他一些Int。

作爲附加的註釋,你可以而且應該離開這裏了return關鍵字,讓斯卡拉隱含知道,如果其他表達式的結果,如函數體的最後一個表達式,應返回:

def isLast(c: Int, r: Int):Int = { 
    if(r == 1) 
    1 
    else if (r == c) 
    1 
    else 
    0 // or some other Int 
} 

最後一點,如果你有一個名字以is開頭的函數,那麼它應該返回一個布爾值。換句話說,如果輸入是最後一個,則返回true,否則返回false。

+2

就像一個筆記,慣用的你應該儘量避免使用''return''。 – syrion

3

你沒有「else」子句,只是一個「else if」,所以你的函數不保證返回一個整數。如果它通過這兩個條件,你將不返回任何東西,這是一個「單位」返回類型。你需要明確地說else 0

+0

它不是什麼都沒有,但是如果你沒有明確地返回一些東西,你的返回類型是「Unit」。 – syrion

12

我懷疑你試圖返回1作爲true的替代品。別;不是這樣。

你的邏輯是:

def isLast(c: Int, r: Int): Boolean = r == 1 || r == c 

: Boolean類型的註釋是可選的。在這裏可以放心,因爲它非常明顯,返回類型來自右邊的短表達式和方法的命名。 1時,不要使用10行代碼。

+0

*這是一個非常好的答案!* – ChuckCottrill