当在类外部使用case类构造函数参数时,它叫什么? [英] What is it called when a case class constructor param is used outside the class?

查看:24
本文介绍了当在类外部使用case类构造函数参数时,它叫什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面第9行发生了什么事情,使result变量可以在第10行访问?

示例来自Akka documentation on testing。第八行中的Ask返回一个scala.concurrent.FutureFuture.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.getFailure,则将抛出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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆