Этот вопрос касается не рефакторинга функции, чтобы избежать явного оператора return.scala Будущее с явным заявлением о возврате
Мне нужно асинхронно запустить функцию с явным оператором return. Например:
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def evaluate(): Future[Int] = Future {
return 42
}
val t = Await.result(evaluate(), 1 second)
println(t)
(работает с AMM)
Если я составляю это, я получаю эту ошибку:
future_return.sc:8: type mismatch;
found : Int(42)
required: scala.concurrent.Future[Int]
return 42
^
Compilation Failed
Итак, мой первый вопрос, почему этот недостаток, а просто имеющий
def evaluate() = Future { 42 }
работает? Есть ли глубокая разница, используя return
, который может обойти ключевое слово Future
до фактического кода функции?
Второй вопрос: как заставить его работать, сохраняя инструкцию return
?
Я пытался что-то вроде
return Future[Int] {42}
, но я получаю эту ошибку
scala.runtime.NonLocalReturnControl
Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [1 second]
поэтому не уверен, что я собираюсь в правильном направлении.
Благодаря
Чтобы выразить это словами: да, существует глубокая разница между 'def x: Future [Int] = Future (42)' и 'def x: Future [Int] = Future {return 42}'. Разница в том, что 'return 42' означает« принудительно изменить поток выполнения и выйти из метода с заданным значением ». Это в значительной степени похоже на то, что вы выбрали исключение, которое, как гарантируется, будет уловлено вызывающим кодом. Вот почему вы должны избегать «возвращения», как чумы. – Yawar