2012-09-24 3 views
19

ich eine neue Lernende von scala bin, und ich versuche, diesen Beispielcodescala, wie zu schreiben, wenn sonst

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

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

zu laufen, aber es gibt mir Zeit Fehler kompilieren, sagen

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

freundlicher hilf mir und schlage mir auch eine gute Seite vor, um scala zu lernen.

+2

Dies ist ein guter Ort, um Scala zu beginnen. http://twitter.github.com/scala_school/ –

Antwort

26

Zuerst lassen Sie uns Ihren Code ein wenig aufzuräumen:

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 ?? 
} 

So scala Sie sagen, dass, wenn r 1, dann 1 zurückzukehren, und wenn r == c, zurückkehren 1. ist das in Ordnung. Wenn Sie möchten, dass die Methode einen Int zurückgibt, muss sie einen in jeden Fall zurückgeben. Also beschwert sich Scala, weil es nicht weiß, was Int zurückgeben soll, wenn r weder 1 noch c ist.

Die Lösung besteht darin, eine else Klausel hinzuzufügen, als einige andere Int.

Als zusätzliche Anmerkung, können Sie und hier das return Stichwort auslassen soll, lassen Scala implizit weiß, dass das Ergebnis des if-else Ausdrucks, als der letzten Ausdruck in der körpereigenen Funktion sollte zurückgegeben werden:

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

Als letzte Anmerkung, wenn Sie eine Funktion haben, deren Name mit is beginnt, dann sollte es wahrscheinlich einen booleschen Wert zurückgeben. Mit anderen Worten, wenn die Eingabe die letzte ist, dann true zurück, sonst false.

+2

Genau wie eine Notiz, sollten Sie idiomatisch versuchen, '' return'' zu vermeiden. – syrion

3

Sie haben keine "else" -Klausel, nur ein "else if", so dass Ihre Funktion nicht garantiert, dass eine Ganzzahl zurückgegeben wird. Wenn es durch beide Bedingungen fällt, werden Sie nichts zurückgeben, das eine Rückgabetyp "Einheit" ist. Sie müssen explizit else 0 sagen.

+0

Es ist nicht Nothing, aber wenn Sie nicht explizit etwas zurückgeben, ist der Rückgabetyp "Unit". – syrion

12

Ich vermute, dass Sie versuchen, 1 als Ersatz für true zurückzugeben. Nicht; es ist nicht.

Ihre Logik ist:

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

Die : Boolean Typenannotation ist optional. Hier ist es sicher, es wegzulassen, weil es sehr offensichtlich ist, was der Rückgabetyp aus dem kurzen Ausdruck auf der rechten Seite und der Benennung der Methode ist. Verwenden Sie nicht 10 Zeilen Code, wenn 1 dies tut.

+0

* Dies ist eine wirklich gute Antwort! * – ChuckCottrill