【发布时间】:2015-05-03 08:51:48
【问题描述】:
我正在用async 和await 编写一个retry 函数
def awaitRetry[T](times: Int)(block: => Future[T]): Future[T] = async {
var i = 0
var result: Try[T] = Failure(new RuntimeException("failure"))
while (result.isFailure && i < times) {
result = await { Try(block) } // can't compile
i += 1
}
result.get
}
Scala 编译器报告错误。由于Try 没有应用方法,因此需要Future[T]。所以我使用 implicit classes
implicit class TryCompanionOps(val t: Try.type) extends AnyVal {
// can't use `apply`!
def convertTriedFuture[T](f: => Future[T]): Future[Try[T]] =
f.map(value => Try(value))
}
// now we can convert Future[T] into Future[Try[T]] e.g,
await { Try.convertTriedFuture(block) }
我的问题是,
为什么我不能使用名称apply 而不是convertTriedFuture?似乎 scala 编译器不允许 overload 只允许 implicit classes 中的 apply 方法。
谢谢。
【问题讨论】: