En el fragmento de código se incluye a continuación, tengo una llamada de función recursiva, que se utiliza para facilitar un reintento si falla una llamada de red (Amazon SimpleDB de vez en cuando devolver un 503 y requieren de reintento.)¿Por qué Scala requiere un tipo de devolución para funciones recursivas?
Cuando intento compilar, el Scala se queja recursive method simpledb_update needs result type
.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
try {
db(config("simpledb_db")) += (name, metadata)
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
}
}
¿Por qué es necesario en las funciones recursivas? Mi idea es simplemente devolver un booleano verdadero/falso para satisfacer al compilador ... las siguientes compilaciones están bien.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int): Boolean = {
try {
db(config("simpledb_db")) += (name, metadata)
true
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
false
}
}
Similar: http://stackoverflow.com/questions/2209179/type-inference-on-method-return-type – missingfaktor
Psst, si está utilizando 2.8, use 'intento: Int = 0' para que su llamada original no lo haga ¡Necesito especificar que es el intento cero! Además, si haces algo profundamente recursivo, podrías desbordar la pila (6 está bien, por supuesto). Para comprobar si Scala puede evitar el uso de la pila, anótelo con '@ annotation.tailrec' antes de' def'. Si no es recursivo de cola, se debe usar la pila y Scala arrojará un error; al menos sabrá con qué se trata cuando elimine la anotación. –
Viniendo de Ruby, esa fue mi primera inclinación. ¡Ay, estoy en 2.7 ... sin apoyo! Es hora de actualizar, supongo. – Joshua