Scala:重用函数值
我有以下两个功能:Scala:重用函数值,scala,functional-programming,Scala,Functional Programming,我有以下两个功能: 1) protected def withBagAsync(body: Bag => Future[Result]): Future[Result] = { //... implementation } 2) protected def withBag(body: Bag => Result): Future[Result] = withBagAsync(body??) 我想重用2中1的功能 但我不知道该怎么做 最简单的实现方
1)
protected def withBagAsync(body: Bag => Future[Result]): Future[Result] = {
//... implementation
}
2)
protected def withBag(body: Bag => Result): Future[Result] =
withBagAsync(body??)
我想重用2
中1
的功能
但我不知道该怎么做 最简单的实现方式如下:
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组合起来。成功的就是一个a=>Future[a]
函数,该函数在将来成功地包装参数
如果withBag
的body
参数可能会因异常而失败,或者如果需要在另一个线程中执行,等等,您可能需要类似以下内容:
import scala.concurrent.ExecutionContext
def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
withBagAsync(bag => Future(body(bag)))
现在,调用者可以隐式或显式地提供执行上下文,由body(bag)
引发的任何异常都将在失败的将来被捕获。最简单的实现如下:
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组合起来。成功的就是一个a=>Future[a]
函数,该函数在将来成功地包装参数
如果withBag
的body
参数可能会因异常而失败,或者如果需要在另一个线程中执行,等等,您可能需要类似以下内容:
import scala.concurrent.ExecutionContext
def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
withBagAsync(bag => Future(body(bag)))
现在,调用方可以隐式或显式地提供执行上下文,以及body(bag)引发的任何异常
将在失败的将来被捕获。处理此问题的一种可能方法是让withBagAsync
方法相信它接收的是一个函数而不是一个值,一个简单的解决方案是将调用作为
protected def withBag(body: Bag => Result): Future[Result] =
{
val function: Bag => Future[Result] = (body: Bag) => Future.successful(Result())
withBagAsync(function)
}
处理这个问题的一个可能方法是让withBagAsync
方法相信它接收的是函数而不是值,一个简单的解决方案是将调用作为
protected def withBag(body: Bag => Result): Future[Result] =
{
val function: Bag => Future[Result] = (body: Bag) => Future.successful(Result())
withBagAsync(function)
}
你能提供一些方法的更多实现细节吗?你能提供一些方法的更多实现细节吗?