Scala: повторно использовать значение функции - PullRequest
0 голосов
/ 29 января 2019

У меня есть эти 2 функции:

  1)
  protected def withBagAsync(body: Bag => Future[Result]): Future[Result] = {
  //... implementation
  }

  2)
  protected def withBag(body: Bag => Result): Future[Result] =
     withBagAsync(body??)

Я хочу повторно использовать функциональность 1 из 2.

Но я не могу понять, как это сделать.

Ответы [ 2 ]

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

Один из возможных подходов к решению этой проблемы состоит в том, чтобы заставить метод withBagAsync полагать, что он получает функцию, а не значение, и простое решение для этого состоит в том, чтобы сделать вызов как

protected def withBag(body: Bag => Result): Future[Result] =
  {
    val function: Bag => Future[Result] = (body: Bag) => Future.successful(Result())

    withBagAsync(function)
  }
0 голосов
/ 29 января 2019

Самая простая реализация будет выглядеть примерно так:

def withBag(body: Bag => Result): Future[Result] =
  withBagAsync(bag => Future.successful(body(bag))

Или, более или менее эквивалентно:

def withBag(body: Bag => Result): Future[Result] =
  withBagAsync(body.andThen(Future.successful))

Вам необходимо преобразовать Bag => Result в Bag => Future[Result], и самый простой способ сделать это - составить заданную вами Bag => Result и Result => Future[Result функцию, а Future.successful - это A => Future[A] функция, которая просто оборачивает аргумент в успешном будущем.

Если аргумент body для withBag может завершиться с ошибкой или если вам нужно, чтобы он был выполнен в другом потоке и т. Д., Вместо этого вам может потребоваться что-то вроде этого:

import scala.concurrent.ExecutionContext

def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
  withBagAsync(bag => Future(body(bag)))

Теперьвызывающая сторона может явно или неявно предоставить контекст выполнения, и любые исключения, выданные body(bag), будут зафиксированы в неудачном будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...