Scala举到一个thunk

时间:2015-06-29 14:56:24

标签: scala thunk

我有一个函数在Promise中包装另一个函数的结果。我想把它推广到一个电梯功能,以便我可以在其他地方重新使用它。以下是原始定义:

val abc = Promise[MyType]()
try {
  val suck = abc.success(someOtherFunction(intParam1, intParam2))
} catch {
  case ex: Exception => p.failure(ex)
}

所以我最终做的是以下内容:

def myLiftFunc[X](x: X) (op: => X): Promise[X] = {
  val p = Promise[X]()

  try {
    p.success(op)
  } catch {
    case NonFatal(ex) =>
    p.failure(ex)
  }
  p
}

我该如何重复使用?我的意思是,我传入的第二个参数应该是一个thunk,这样我就可以传入任何函数体,而不管函数体所需的参数如何!

当我将提升的功能称为:

myLiftFunc(someOtherFunction(intParam1, intParam2))

此类型为Int => Promise[Int],其中someOtherFunction返回Int。当我致电Promise[Int]时,我只想myLiftFunc

1 个答案:

答案 0 :(得分:1)

您可能对Promise.fromTry方法感兴趣。该方法使用Try中的scala.util惯用法,这是一个有用的结构,允许您将try...catch语句更像传统结构:

Promise.fromTry { Try { someOtherFunction(intParam1, intParam2) } }

如果你想改正自己的助手(这样就不需要Try部分,你可以试试:

def myLiftFunc[X](op: => X): Promise[X] = Promise.fromTry(Try(op))

这将允许你这样做:

myLiftFunc { /*arbitrary logic*/ }
myLiftFunc(1 + 4).future.value.get //Success(5)
myLiftFunc(1/0).future.value.get //Failure(java.lang.ArithmeticException: / by zero)