Scala-추출기

Scala의 추출기는 다음과 같은 메서드가있는 객체입니다. unapply회원 중 하나로. 해당 unapply 메서드의 목적은 값을 일치시키고 분리하는 것입니다. 종종 추출기 객체는 이중 방법을 정의합니다.apply 가치를 구축하기 위해 필요한 것은 아닙니다.

객체가 둘 다 정의하는 예를 살펴 보겠습니다. applyunapply행동 양식. 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