E215: Named Pattern Not Applicable
E215: Named Pattern Not Applicable
이 에러는 이름 있는 튜플(named tuple)이나 케이스 클래스가 아닌 타입에 대해 패턴 매칭에서 이름 있는 패턴을 사용할 때 발생해요.
본문
이름 있는 패턴은 위치가 아니라 이름으로 요소를 매칭할 수 있게 해 줘요(예: 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")