Scala Lifting to a thunk
Scala Lifting to a 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
returns 和 Int
。当我调用 myLiftFunc
!
时,我只想 Promise[Int]
您可能对 Promise.fromTry
方法感兴趣。该方法使用 scala.util
中的 Try
习语,这是一个有用的结构,允许您将 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)
我有一个函数将另一个函数的结果包装在 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
returns 和 Int
。当我调用 myLiftFunc
!
Promise[Int]
您可能对 Promise.fromTry
方法感兴趣。该方法使用 scala.util
中的 Try
习语,这是一个有用的结构,允许您将 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)