我如何转换这个:
Await.result(purchase, 5 seconds)
能够以以下方式编写相同的语句:
purchase.await(5 seconds)
只是想通过编写自己的自定义dsl来学习如何重写我的一些代码。
您可以创建自己的隐式类:
import scala.concurrent.{Await, Awaitable}
import scala.concurrent.duration.Duration
object syntax {
object await {
implicit class AwaitableOps[T](private val awaitable: Awaitable[T]) extends AnyVal {
@inline
final def await(atMost: Duration): T =
Await.result(awaitable, atMost)
}
}
}
你可以这样使用:
import syntax.await._
purchase.await(5.seconds) // Note the dot. The postFix operator syntax is discouraged.
在Scala 3中,您可以编写类似的扩展方法
def [T](f: Future[T]).await(atMost: Duration) = Await.result(f, atMost)
scastie示例