在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(Amazon SimpleDB偶尔会返回503并需要重试。)
当我尝试编译时,Scala会抱怨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")
}
}
为什么递归函数需要这个?我的想法是只返回一个true / false布尔值来满足编译器...以下编译很好。
// 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
}
}
答案 0 :(得分:19)
据我所知,递归函数需要一个返回类型,因为类型推断算法的功能不足以确定所有递归函数的返回类型。
但是,您不需要编写返回类型,只需要声明您已经使用的返回类型:Unit。 Unit是一种特殊类型,只有一个元素()。它也是Scala中大多数“语句”的类型,并且是为不需要返回任何内容的方法声明的返回类型,但仅针对它们的副作用执行(就像你的那样)。您可以将方法声明为返回单位,就像将其他类型
一样def simpledb_update(name: String, metadata: Map[String,String], attempt: Int):Unit = {
更具惯用性Scala为单元返回方法提供了一种特殊的语法,只需省略返回类型和等号
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int){
根据scala样式指南,您应该更喜欢使用等号
答案 1 :(得分:10)
只需从行中删除=,它将返回Unit,这意味着您不需要返回任何内容。
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) {
我认为需要返回类型,以确保所有递归路径都具有正确的类型。在正常函数上,将从所有返回点推断出类型。