scala - 为什么 Scala 需要递归函数的返回类型?

标签 scala

在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(Amazon SimpleDB 有时会返回 503 并需要重试。)

当我尝试编译时,Scala 提示递归方法 simpledb_update 需要结果类型

// 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")
   }
 }

为什么递归函数需要这样?我的想法是只返回一个真/假 bool 值来满足编译器的要求......以下编译正常。

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

最佳答案

据我了解,递归函数需要返回类型,因为类型推断算法不够强大,无法确定所有递归函数的返回类型。

但是,您不需要构建返回类型,只需声明您已经使用的返回类型: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 风格指南,你应该更喜欢使用等号

http://docs.scala-lang.org/style/declarations.html

关于scala - 为什么 Scala 需要递归函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739133/

相关文章:

string - 有没有办法扩展 Scala 的 RichString?

scala - 如何在 lift Crudify 中将字段设置为只读

scala - 如何强制 scalac 生成静态最终字段?

mysql - 将 Biginteger 转换为 long 会导致错误

scala - 使用关联和交换运算符折叠/减少 future 列表

java - 格式 UTC 日期时间

scala - 从参数列表实例化案例类

debugging - Scala Eclipse IDE 突然忽略断点

java - AWS EMR 上的 avro 错误

scala - Spark Streaming groupByKey 和 updateStateByKey 实现