我看到了一些代码片段,如下所示:
val future = testActor ? Running()
val Success(running: Boolean) = future.value.get
所以future
属于Future
型,让我感到困惑的是它为变量running
赋值的方式。
谁能向我解释一下这个val Success(running: Boolean)
在 scala 中叫什么?
谢谢
它是模式匹配的一种形式,或者在这种情况下也称为提取器。
因此,您可以执行以下操作:
val tuple = (1, 2)
opt match {
case (x, y) => ???
}
您可以这样做:
val tuple = (1, 2)
val (x, y) = tuple
无论如何,在这个答案中值得一提的是,那段代码是一个完整的代码气味。
原因有四:
- 该提取器并不详尽。如果将来失败但出现某些异常,则
future.value.get
的结果将是包含异常的Failure(e(,在这种情况下,该异常不会被捕获或处理,并且将被抑制,MatchError
丢失了所有出错的信息。 - 使用期货的代码必须将其用于所有事情。你应该使用
map
&flatMap
来撰写期货,所以你所有的程序都是一个大的未来。等待或试图获得未来的价值意味着未来被滥用,或者编码人员不知道如何使用期货。 Future.value
大多是无用的,如果它已经完成,它会试图给你未来的价值。这再次违背了期货的使用方式。Option.get
是一种不好的做法,原因与第一点类似。
一般来说,这条线假设未来已经完成并且没有错误地完成。这两种假设在实际代码上都是不切实际的。
这称为模式匹配。您可以断言某个值属于指定的子类型,并立即访问其结构。例如:
val one = Some("hello")
val two = None
val Some(hello) = one // hello is "hello"
val Some(wrong) = two // error
有时这种技术也称为解构。
另请参阅提取程序对象。