E215: Named Pattern Not Applicable

E215: Named Pattern Not Applicable

이 에러는 이름 있는 튜플(named tuple)이나 케이스 클래스가 아닌 타입에 대해 패턴 매칭에서 이름 있는 패턴을 사용할 때 발생해요.

출처: Scala 3 Reference

본문

이름 있는 패턴은 위치가 아니라 이름으로 요소를 매칭할 수 있게 해 줘요(예: name = n). 하지만 이 기능은 알려진 필드 이름이 있어 컴파일러가 패턴 매칭에 사용할 수 있는 이름 있는 튜플과 케이스 클래스에서만 사용할 수 있어요.

예시 (Example)

class MyClass(val name: String, val age: Int)

object MyExtractor:
  def unapply(x: MyClass): Some[(String, Int)] = Some((x.name, x.age))

def example(obj: MyClass) = obj match
  case MyExtractor(name = n, age = a) => println(s"$n is $a years old")

에러 (Error)

-- [E215] Pattern Match Error: example.scala:7:18 ------------------------------
7 |  case MyExtractor(name = n, age = a) => println(s"$n is $a years old")
  |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |Named patterns cannot be used with (String, Int), because it is not a named tuple or case class

해결 방법 (Solution)

대신 위치 기반 패턴 매칭을 사용해요.

class MyClass(val name: String, val age: Int)

object MyExtractor:
  def unapply(x: MyClass): Some[(String, Int)] = Some((x.name, x.age))

def example(obj: MyClass) = obj match
  case MyExtractor(n, a) => println(s"$n is $a years old")

아니면 이름 있는 패턴을 지원하는 케이스 클래스를 사용해요.

case class Person(name: String, age: Int)

def example(person: Person) = person match
  case Person(name = n, age = a) => println(s"$n is $a years old")

이름 있는 튜플도 이름 있는 패턴을 지원해요.

def example(data: (name: String, age: Int)) = data match
  case (name = n, age = a) => println(s"$n is $a years old")