Scala - передача функции в Future.apply - PullRequest
0 голосов
/ 25 января 2019

Я изучаю Scala и просто знакомлюсь с синтаксисом. Я вижу, что Future.apply принимает функцию за работу.

Отлично работает следующее:

val future = Future { doWork(1) }

Однако только для экспериментов я попробовал другие способы сделать это, но ни один из них не работает должным образом.

val future = Future(() => doWork(1))

Это приводит к тому, что лямбда становится значением завершения будущего, а не возвращаемым значением doWork(1).

val work: () => Int = () => doWork(index)
val future = Future(work)

Та же ситуация здесь. Может ли кто-нибудь объяснить, почему передача функции в качестве выполняемой работы вместо этого приводит к тому, что функция фактически становится возвращаемым значением выполняемой работы. Также, как бы я пошел по этому поводу. Спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Подпись метода, вызванного в Future {...}, равна def apply[T](body: =>T), где => T - это параметр by-name.См. Эту документацию для получения дополнительной информации.

Параметры по имени оцениваются только при использовании.

В примерах

Future(() => doWork(1)) 

и

val work: () => Int = () => doWork(index)
val future = Future(work)

Youпередаются как by-name функция параметра типа () => Int или как Function0[Int].Эта функция возвращается в Future при оценке параметра by-name.

Функция не оценивается, так как Future не вызывает apply или ().

Будет более понятно, если вы добавите параметры типа к Future во всех примерах.Если doWork возвращает Int.В этом случае Future { doWork(1) } равно Future[Int], тогда как во втором и третьем примерах оно равно Future[Function0[Int]].

Правильное использование будет

val work: () => Int = () => doWork(index)
val future = Future(work())
...