问题
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.
回答1:
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.
回答2:
v match {
a @ case A(x) =>
doSomething(a)
}
By the way, you don't need the semicolon.
回答3:
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