在 Scala 语法中调用的带有类名和参数的赋值是什么?



我看到了一些代码片段,如下所示:

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

无论如何,在这个答案中值得一提的是,那段代码是一个完整的代码气味。

原因有四:

  1. 该提取器并不详尽。如果将来失败但出现某些异常,则future.value.get的结果将是包含异常的Failure(e(,在这种情况下,该异常不会被捕获或处理,并且将被抑制,MatchError丢失了所有出错的信息。
  2. 使用期货的代码必须将其用于所有事情。你应该使用map&flatMap来撰写期货,所以你所有的程序都是一个大的未来。等待或试图获得未来的价值意味着未来被滥用,或者编码人员不知道如何使用期货。
  3. Future.value大多是无用的,如果它已经完成,它会试图给你未来的价值。这再次违背了期货的使用方式。
  4. Option.get是一种不好的做法,原因与第一点类似。

一般来说,这条线假设未来已经完成并且没有错误地完成。这两种假设在实际代码上都是不切实际的。

这称为模式匹配。您可以断言某个值属于指定的子类型,并立即访问其结构。例如:

val one = Some("hello")
val two = None
val Some(hello) = one  // hello is "hello"
val Some(wrong) = two  // error

有时这种技术也称为解构。

另请参阅提取程序对象。

最新更新