加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:35:25 所属栏目:安全 来源:网络整理
导读:在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时方便重试(Amazon SimpleDB偶尔返回503并需要重试)。 当我尝试编译时,Scala抱怨递归方法simpledb_update需要结果类型。 // sends data to SimpleDB. Retries if necessarydef simpledb_updat
在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时方便重试(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")
   }
 }

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

// sends data to SimpleDB. Retries if necessary
 def simpledb_update(name: 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,attempt + 1)
   } else
    AUlog(name + ": SimpleDB Failed")
    false
  }
}

解决方法

据我所知,递归函数需要返回类型,因为类型推理算法的强度不足以确定所有递归函数的返回类型。

但是,您不需要构成返回类型,您只需要声明您已经使用的返回类型:单位。单位是一个只有一个元素()的特殊类型。它也是Scala中大多数“语句”的类型,并且是用于声明方法的返回类型,不需要返回任何内容,而是仅为其副作用执行(因为它们是)。您可以声明您的方法作为返回单位,如其他类型

def simpledb_update(name: String,attempt: Int):Unit = {

更准确地说,Scala为单位返回方法提供了一种特殊的语法,只是忽略了返回类型和等号

def simpledb_update(name: String,attempt: Int){

根据斯卡拉风格指南,您应该更喜欢使用等号

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读