Scala-패턴 매칭
패턴 매칭은 함수 값과 클로저 다음으로 Scala의 두 번째로 널리 사용되는 기능입니다. Scala는 메시지를 처리 할 때 패턴 일치를 지원합니다.
패턴 일치에는 각각 키워드로 시작하는 일련의 대안이 포함됩니다. case. 각 대안에는pattern 및 하나 이상의 expressions, 패턴이 일치하면 평가됩니다. 화살표 기호 =>는 패턴과 표현식을 구분합니다.
정수 값과 일치하는 방법을 보여주는 다음 예제 프로그램을 시도하십시오.
예
object Demo {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
위의 프로그램을 Demo.scala. 다음 명령은이 프로그램을 컴파일하고 실행하는 데 사용됩니다.
명령
\>scalac Demo.scala
\>scala Demo
산출
many
case 문이있는 블록은 정수를 문자열에 매핑하는 함수를 정의합니다. match 키워드는 객체에 함수 (위의 패턴 일치 함수와 같은)를 적용하는 편리한 방법을 제공합니다.
다른 유형의 패턴에 대해 값을 일치시키는 다음 예제 프로그램을 시도하십시오.
예
object Demo {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
위의 프로그램을 Demo.scala. 다음 명령은이 프로그램을 컴파일하고 실행하는 데 사용됩니다.
명령
\>scalac Demo.scala
\>scala Demo
산출
2
many
one
케이스 클래스를 사용한 매칭
그만큼 case classes케이스 표현식과 패턴 일치에 사용되는 특수 클래스입니다. 구문 적으로 다음은 특수 수정자가있는 표준 클래스입니다.case.
다음을 시도해보십시오. 케이스 클래스를 사용한 간단한 패턴 매칭 예제입니다.
예
object Demo {
def main(args: Array[String]) {
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) => println(
"Age: " + age + " year, name: " + name + "?")
}
}
}
case class Person(name: String, age: Int)
}
위의 프로그램을 Demo.scala. 다음 명령은이 프로그램을 컴파일하고 실행하는 데 사용됩니다.
명령
\>scalac Demo.scala
\>scala Demo
산출
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?
case 키워드를 추가하면 컴파일러가 여러 유용한 기능을 자동으로 추가합니다. 키워드는 패턴 일치에서 케이스 표현식과의 연관을 제안합니다.
먼저 컴파일러는 생성자 인수를 변경 불가능한 필드 (vals)로 자동 변환합니다. val 키워드는 선택 사항입니다. 변경 가능한 필드를 원하면 var 키워드를 사용하십시오. 따라서 생성자 인수 목록이 이제 더 짧아졌습니다.
둘째, 컴파일러는 자동으로 equals, hashCode, 과 toString생성자 인수로 지정된 필드를 사용하는 클래스에 대한 메서드. 따라서 더 이상 자체 toString () 메서드가 필요하지 않습니다.
마지막으로, 또한 Person 정의 할 메서드가 없기 때문에 클래스가 비어 있습니다!