2016-10-09 2 views
-2

Этот вопрос касается не рефакторинга функции, чтобы избежать явного оператора 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] 

поэтому не уверен, что я собираюсь в правильном направлении.

Благодаря

+0

Чтобы выразить это словами: да, существует глубокая разница между 'def x: Future [Int] = Future (42)' и 'def x: Future [Int] = Future {return 42}'. Разница в том, что 'return 42' означает« принудительно изменить поток выполнения и выйти из метода с заданным значением ». Это в значительной степени похоже на то, что вы выбрали исключение, которое, как гарантируется, будет уловлено вызывающим кодом. Вот почему вы должны избегать «возвращения», как чумы. – Yawar

ответ

1

Ошибка проста: 42 не типа Future[Int]. Чтобы сделать то, что вы хотите сделать, используйте Future.successful(42). Это чистый способ создания Успеха, содержащего Int. Я предлагаю вам ознакомиться с концепцией монады, и если вы знаете монады, перечитайте, что такое Фьючерсы в Scala.

Ваша ошибка довольно распространена, я очень много боролся с такими вещами в мои ранние дни Scala, но лучший способ избежать этих препятствий - иметь четкое понимание теории и знать все инструменты, используемые Scala для реализовать его.

Редактировать: Избегайте использования return в Scala.

+0

Я также попытался 'return Future.successful (42)' и все равно получить 'scala.runtime.NonLocalReturnControl error' – ascobol

+2

Попробуйте удалить ключевое слово return – Chobeat

+0

, конечно же, оно будет работать без ключевого слова' return'. Реальная функция 'оценки' намного сложнее, чем этот тривиальный пример, и переписать его, чтобы избежать любого оператора возврата, на самом деле не вариант. – ascobol

Смежные вопросы