Scala-추출기
Scala의 추출기는 다음과 같은 메서드가있는 객체입니다. unapply회원 중 하나로. 해당 unapply 메서드의 목적은 값을 일치시키고 분리하는 것입니다. 종종 추출기 객체는 이중 방법을 정의합니다.apply 가치를 구축하기 위해 필요한 것은 아닙니다.
예
객체가 둘 다 정의하는 예를 살펴 보겠습니다. apply 과 unapply행동 양식. apply 메서드는 언제나와 같은 의미를 가지고 있습니다. Test를 메서드가 적용되는 것과 같은 방식으로 괄호 안의 인수에 적용될 수있는 객체로 변환합니다. 따라서 Test ( "Zara", "gmail.com")를 작성하여 "[email protected]"문자열을 구성 할 수 있습니다.
그만큼 unapply 메서드는 Test 클래스를 extractor 그리고 그것은 건설 과정을 역전시킵니다 apply. apply는 두 개의 문자열을 가져 와서 이메일 주소 문자열을 구성하는 경우, unapply는 이메일 주소를 가져와 잠재적으로 두 개의 문자열을 반환합니다.user 그리고 domain 주소의.
그만큼 unapply또한 주어진 문자열이 이메일 주소가 아닌 경우를 처리해야합니다. 이것이 unapply가 문자열 쌍에 대해 Option 유형을 반환하는 이유입니다. 그 결과는Some (user, domain)문자열 str이 지정된 사용자 및 도메인 부분이있는 이메일 주소 인 경우, str이 이메일 주소가 아닌 경우 None입니다. 다음은 몇 가지 예입니다.
통사론
unapply("[email protected]") equals Some("Zara", "gmail.com")
unapply("Zara Ali") equals None
다음 예제 프로그램은 이메일 주소에 대한 추출기 객체를 보여줍니다.
예
object Demo {
def main(args: Array[String]) {
println ("Apply method : " + apply("Zara", "gmail.com"));
println ("Unapply method : " + unapply("[email protected]"));
println ("Unapply method : " + unapply("Zara Ali"));
}
// The injection method (optional)
def apply(user: String, domain: String) = {
user +"@"+ domain
}
// The extraction method (mandatory)
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2){
Some(parts(0), parts(1))
} else {
None
}
}
}
위의 프로그램을 Demo.scala. 다음 명령은이 프로그램을 컴파일하고 실행하는 데 사용됩니다.
명령
\>scalac Demo.scala
\>scala Demo
산출
Apply method : [email protected]
Unapply method : Some((Zara,gmail.com))
Unapply method : None
추출기를 사용한 패턴 매칭
클래스의 인스턴스 뒤에 0 개 이상의 매개 변수 목록이있는 괄호가 오면 컴파일러는 apply해당 인스턴스의 메서드. 객체와 클래스 모두에서 적용을 정의 할 수 있습니다.
위에서 언급했듯이 unapply방법은 우리가 찾고있는 특정 값을 추출하는 것입니다. 반대 동작을합니다apply그렇습니다. 추출기 객체를 비교할 때match 진술 unapply 메소드가 자동으로 실행됩니다.
다음 예제 프로그램을 시도하십시오.
예
object Demo {
def main(args: Array[String]) {
val x = Demo(5)
println(x)
x match {
case Demo(num) => println(x+" is bigger two times than "+num)
//unapply is invoked
case _ => println("i cannot calculate")
}
}
def apply(x: Int) = x*2
def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}
위의 프로그램을 Demo.scala. 다음 명령은이 프로그램을 컴파일하고 실행하는 데 사용됩니다.
명령
\>scalac Demo.scala
\>scala Demo
산출
10
10 is bigger two times than 5