【发布时间】:2011-04-13 22:33:06
【问题描述】:
在下面包含的代码 sn-p 中,我有一个递归函数调用,用于在网络调用失败时促进重试(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")
}
}
为什么递归函数需要这样做?我的想法是只返回一个真/假布尔值来满足编译器......以下编译得很好。
// 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
}
}
【问题讨论】:
-
Psst,如果您使用的是 2.8,请使用
attempt: Int = 0,这样您的原始调用就不需要指定它是第 0 次尝试!此外,如果你做任何深度递归,你可能会溢出堆栈(当然,6 很好)。要检查 Scala 是否可以避免使用堆栈,请在def之前使用@annotation.tailrec对其进行注释。如果它不是尾递归的,则必须使用堆栈,Scala 会抛出一个错误——那么至少你知道当你删除注解时你在处理什么。 -
来自 Ruby,这是我的第一个倾向。唉,我在 2.7... 不受支持!我想是时候升级了。
标签: scala