스칼라 추출기


추출기는 전달된 객체에서 객체를 구성하는 데 사용되는 매개변수를 추출합니다.

Scala 표준 라이브러리에는 미리 정의된 추출기가 몇 가지 포함되어 있는데, 이에 대해 간단히 살펴보겠습니다.

Scala 추출기는 unapply 메소드를 사용하는 객체입니다. unapply 메소드는 apply 메소드의 반대 작업입니다. unapply는 객체를 승인한 다음 객체에서 값을 추출합니다. 추출된 값은 일반적으로 객체를 구성하는 데 사용되는 값입니다.

다음 예는 이메일 주소의 추출기 개체를 보여줍니다.

object Test {
   def main(args: Array[String]) {
      
      println ("Apply 方法 : " + apply("Zara", "gmail.com"));
      println ("Unapply 方法 : " + unapply("Zara@gmail.com"));
      println ("Unapply 方法 : " + unapply("Zara Ali"));

   }
   // 注入方法 (可选)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // 提取方法(必选)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1)) 
      }else{
         None
      }
   }
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ scalac Test.scala 
$ scala Test
Apply 方法 : Zara@gmail.com
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

위 개체는 두 가지 메서드를 정의합니다. 🎜>적용적용 취소 방법을 사용하세요. Apply 메소드를 사용하면 새로운 작업을 사용하지 않고도 객체를 생성할 수 있습니다. 따라서 Test("Zara", "gmail.com") 문을 통해 문자열 "Zara@gmail.com"을 구성할 수 있습니다.

unapply 메소드는 apply 메소드의 반대 작업입니다. unapply는 객체를 승인한 다음 객체에서 값을 추출합니다. 추출된 값은 일반적으로 객체를 구성하는 데 사용되는 값입니다. 우리가 사용하는 예에서는 Unapply 메소드는 객체에서 사용자 이름과 이메일 주소 접미사를 추출합니다.

인스턴스의 unapply 메소드는 수신 문자열이 이메일 주소가 아닌 경우 None을 반환합니다. 코드 데모는 다음과 같습니다.

unapply("Zara@gmail.com") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None


추출기는 패턴 일치를 사용합니다

클래스를 인스턴스화할 때 0개 이상의 매개변수를 가져올 수 있으며 컴파일러는 이를 인스턴스화합니다. 메소드가 호출됩니다. 클래스와 객체 모두에서 Apply 메서드를 정의할 수 있습니다.

앞서 언급했듯이 unapply는 찾기 위해 지정한 값을 추출하는 데 사용되며, 이는 apply의 반대입니다. 추출기 개체에서 match 문을 사용하면 다음과 같이 unapply가 자동으로 실행됩니다.

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)

      x match
      {
         case Test(num) => println(x + " 是 " + num + " 的两倍!")
         //unapply 被调用
         case _ => println("无法计算")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ scalac Test.scala 
$ scala Test
10
10 是 5 的两倍!