Я пишу retry
функции с async
и await
не перегружать применять метод в Scala неявного классе
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 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 не разрешает перегруз только около apply
методов в неявных классов.
Спасибо.
Комментарий к потенциальной проблеме производительности очень полезен. Спасибо, Кольмар. – 1ambda