Учебники

Скала — экстракторы

Экстрактор в Scala — это объект, у которого в качестве одного из членов есть метод unapply . Цель этого неприменимого метода — сопоставить значение и разобрать его. Часто объект экстрактора также определяет двойной метод, применяемый для создания значений, но это не обязательно.

пример

Давайте возьмем пример того, как объект определяет методы apply и unapply . Метод apply имеет то же значение, что и всегда: он превращает Test в объект, который можно применять к аргументам в скобках так же, как применяется метод. Таким образом, вы можете написать Test («Zara», «gmail.com»), чтобы создать строку «Zara@gmail.com».

Метод unapply — это то, что превращает класс Test в экстрактор и обращает процесс создания применения . Если apply принимает две строки и формирует из них строку адреса электронной почты, unapply принимает адрес электронной почты и возвращает потенциально две строки: пользователя и домен адреса.

Отмена также должна обрабатывать случай, когда данная строка не является адресом электронной почты. Вот почему unapply возвращает тип Option для пар строк. Его результатом является либо Some (пользователь, домен), если строка str является адресом электронной почты с указанными частями пользователя и домена, либо None, если str не является адресом электронной почты. Вот несколько примеров следующим образом.

Синтаксис

unapply("Zara@gmail.com") 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("Zara@gmail.com"));
      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 : Zara@gmail.com
Unapply method : Some((Zara,gmail.com))
Unapply method : None

Сравнение шаблонов с экстракторами

Когда за экземпляром класса следуют круглые скобки со списком из нуля или более параметров, компилятор вызывает метод apply для этого экземпляра. Мы можем определить применение как в объектах, так и в классах.

Как упомянуто выше, цель метода unapply состоит в том, чтобы извлечь конкретное значение, которое мы ищем. Это делает противоположную операцию применяется делает. При сравнении объекта экстрактора с использованием оператора match автоматически будет выполнен метод неприменить .

Попробуйте следующий пример программы.

пример

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 . Следующие команды используются для компиляции и выполнения этой программы.