3
votes

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.

3

3 Answers

10
votes

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.

1
votes
v match {
  a @ case A(x) =>
    doSomething(a)
}

By the way, you don't need the semicolon.

0
votes

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.