When pattern matching case classes how do you actually refer to the class which it was matched to?
Here's an example to show what I mean:
sealed trait Value
case class A(n: Int) extends Value
v match {
case A(x) =>
doSomething(A);
}
Where v is of type value and doSomething takes an parameter of type A, not Value.
Do this
v match {
case a @ A(x) =>
doSomething(a)
}
@ is called Pattern Binder (Refer § 8.1.3). From the reference:
A pattern binder x@p consists of a pattern variable x and a pattern p. The type of the variable x is the static type T of the pattern p. This pattern matches any value v matched by the pattern p, provided the run-time type of v is also an instance of T , and it binds the variable name to that value.
v match {
a @ case A(x) =>
doSomething(a)
}
By the way, you don't need the semicolon.
Case classes are deconstructed
You wouldn't refer to A, as you would refer to the deconstructed object, hence you would only get access to x in the context of your case.
However, you would know that the context was A, since you matched the case, so it would be easy to construct a new case class from your arguments.
来源:https://stackoverflow.com/questions/21521637/scala-pattern-matching-referencing