当在类外部使用case类构造函数参数时,它叫什么? [英] What is it called when a case class constructor param is used outside the class?
本文介绍了当在类外部使用case类构造函数参数时,它叫什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面第9行发生了什么事情,使result
变量可以在第10行访问?
示例来自Akka documentation on testing。第八行中的Ask
返回一个scala.concurrent.Future
。Future.value()
返回Option[Try[T]],它将是Some(Success(t))
或Some(Failure(error))
。然后调用Some.get
,它应该返回t
或错误,这取决于Try
的结果。
future.value.get
的值是不是第9行中的错误,它都试图用Some.get
的返回值实例化一个新的成功which is defined as a case class in Try。第9行的Success不是直接使用的,而是case类构造函数参数result
以某种方式使其进入作用域,因此可以在第10行使用。这在Scala中叫什么?在哪里可以找到有关此语法如何工作的详细信息?
1. import akka.testkit.TestActorRef
2. import scala.concurrent.duration._
3. import scala.concurrent.Await
4. import akka.pattern.ask
5.
6. val actorRef = TestActorRef(newMyActor)
7. // hypothetical message stimulating a '42' answer
8. val future = actorRef ? Say42
9. val Success( result: Int ) = future.value.get
10. result should be (42)
推荐答案
val Success( result: Int ) = future.value.get
是模式匹配。在声明val时,可以使用模式匹配为标识符赋值。跟写字差不多:
val result: Int = future.value.get match {
case Success(r: Int) => r
}
但是请注意,这不是完全匹配,如果future.value.get
是Failure
,则将抛出MatchError
。在单元测试的上下文中,我总是像这样使用模式匹配,因为MatchError
将是另一个失败的指示。
以下是几个类似(更安全)模式匹配分配的示例:
val (a, b) = (1, 2)
case class Test(i: Int, j: String)
val test = Test(1, "a")
val (i, j) = test
val list = List(1, 2, 3, 4)
val List(first, second, _*) = list // though this will fail if the List has less than 3 elements
这篇关于当在类外部使用case类构造函数参数时,它叫什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文