Экстрактор в Scala — это объект, у которого в качестве одного из членов есть метод unapply . Цель этого неприменимого метода — сопоставить значение и разобрать его. Часто объект экстрактора также определяет двойной метод, применяемый для создания значений, но это не обязательно.
пример
Давайте возьмем пример того, как объект определяет методы apply и unapply . Метод apply имеет то же значение, что и всегда: он превращает Test в объект, который можно применять к аргументам в скобках так же, как применяется метод. Таким образом, вы можете написать Test («Zara», «gmail.com»), чтобы создать строку «[email protected]».
Метод unapply — это то, что превращает класс Test в экстрактор и обращает процесс создания применения . Если apply принимает две строки и формирует из них строку адреса электронной почты, unapply принимает адрес электронной почты и возвращает потенциально две строки: пользователя и домен адреса.
Отмена также должна обрабатывать случай, когда данная строка не является адресом электронной почты. Вот почему unapply возвращает тип Option для пар строк. Его результатом является либо Some (пользователь, домен), если строка str является адресом электронной почты с указанными частями пользователя и домена, либо None, если str не является адресом электронной почты. Вот несколько примеров следующим образом.
Синтаксис
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
Сравнение шаблонов с экстракторами
Когда за экземпляром класса следуют круглые скобки со списком из нуля или более параметров, компилятор вызывает метод 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 . Следующие команды используются для компиляции и выполнения этой программы.