2012-09-24 21 views
19

Soy un alumno nuevo de Scala, y estoy tratando de ejecutar este código de ejemploScala cómo escribir si otra cosa

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

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

Pero me da error de compilación tiempo, diciendo

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

favor ayúdame y también sugiéreme un buen sitio para aprender scala.

+2

Este es un buen lugar para comenzar Scala. http://twitter.github.com/scala_school/ –

Respuesta

26

En primer lugar, vamos a limpiar su código un poco:

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

Así que usted está diciendo que si Scala r es 1, a continuación, volver 1, y si r == c, de vuelta 1. Eso está bien. Pero si desea que el método devuelva un Int, debe devolver uno en cada caso. Entonces Scala se queja porque no sabe qué Int devolver cuando r no es 1 ni c.

La solución es agregar una cláusula else que devuelve alguna otra Int.

Como una nota adicional, que puede y debe dejar de lado la palabra clave return aquí, dejando Scala implícitamente sabe que el resultado de la expresión if-else, como la última expresión en el cuerpo de la función, debe ser devuelto:

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

Como nota final, si tiene una función cuyo nombre comienza por is, probablemente debería devolver un valor booleano. En otras palabras, si la entrada es la última, entonces devuelve verdadero, de lo contrario es falso.

+2

Al igual que una nota, idiomáticamente deberías tratar de evitar el uso de '' return''. – syrion

3

No tiene una cláusula "else", solo un "else if", por lo que no se garantiza que su función devuelva un entero. Si cae en ambas condiciones, no devolverá nada, que es un tipo de devolución "Unidad". Debe decir explícitamente else 0.

+0

No es nada, pero si no devuelve algo explícitamente, su tipo de devolución es "Unidad". – syrion

12

Sospecho que está intentando devolver 1 como sustituto de true. No; no lo es.

Su lógica es:

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

El : Boolean tipo de anotación es opcional. Aquí es seguro dejarlo fuera porque es muy obvio cuál es el tipo de devolución de la expresión corta a la derecha y su nombre del método. No use 10 líneas de código cuando lo haga 1.

+0

* ¡Esta es una gran respuesta! * – ChuckCottrill

Cuestiones relacionadas