栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Scala实现这种可重试调用的方式是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Scala实现这种可重试调用的方式是什么?

递归+ 一流的功能 ,按名称参数==很棒。

def retry[T](n: Int)(fn: => T): T = {  try {    fn  } catch {    case e =>      if (n > 1) retry(n - 1)(fn)      else throw e  }}

用法是这样的:

retry(3) {  // insert pre that may fail here}

编辑
:受@themel的答案启发而略有变化。少一行代码:-)

def retry[T](n: Int)(fn: => T): T = {  try {    fn  } catch {    case e if n > 1 =>      retry(n - 1)(fn)  }}

再次编辑
:递归使我感到困扰,因为它向堆栈跟踪添加了多个调用。由于某些原因,编译器无法在catch处理程序中优化尾部递归。但是,尾部递归不在catch处理程序中,可以很好地优化:-)

@annotation.tailrecdef retry[T](n: Int)(fn: => T): T = {  val r = try { Some(fn) } catch { case e: Exception if n > 1 => None }  r match {    case Some(x) => x    case None => retry(n - 1)(fn)  }}

再次编辑
:显然,我将把它作为一种爱好,不断回来并为此答案添加替代方法。这是一个尾递归版本,它比使用更加简单

Option
,但是使用
return
短路功能并不是惯用的Scala。

@annotation.tailrecdef retry[T](n: Int)(fn: => T): T = {  try {    return fn  } catch {    case e if n > 1 => // ignore  }  retry(n - 1)(fn)}

Scala 2.10更新 。作为我的业余爱好,我偶尔会重新审视此答案。Try引入的Scala 2.10
提供了一种以尾递归方式实现重试的干净方法。

// Returning T, throwing the exception on failure@annotation.tailrecdef retry[T](n: Int)(fn: => T): T = {  util.Try { fn } match {    case util.Success(x) => x    case _ if n > 1 => retry(n - 1)(fn)    case util.Failure(e) => throw e  }}// Returning a Try[T] wrapper@annotation.tailrecdef retry[T](n: Int)(fn: => T): util.Try[T] = {  util.Try { fn } match {    case util.Failure(_) if n > 1 => retry(n - 1)(fn)    case fn => fn  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/595214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号