English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Экстракторы (extractors) в Scala

Извлекатель извлекает параметры, необходимые для создания объекта, из переданного ему объекта.

Scala стандартная библиотека содержит了一些 предопределенных извлекателей, мы кратко рассмотрим их.

Извлекатель Scala - это объект с методом unapply. Метод unapply можно считать обратной операцией метода apply: unapply принимает объект, а затем извлекает из него значения, которые обычно используются для создания значения объекта. В примере мы используем

Ниже приведен пример объекта извлекателя электронной почты:

object Test {
   def main(args: Array[String]) {
      
      println ("Метод Apply: " + apply("Zara", "gmail.com"));
      println ("Метод Unapply: " + unapply("[email protected]"));
      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: [email protected]
Метод Unapply: Some((Zara,gmail.com))
Метод Unapply: None

Указанные объекты определяют два метода: apply и unapply метод. Через метод apply мы можем создавать объекты без использования операции new. Поэтому вы можете использовать фразу Test("Zara", "gmail.com") для создания строки "[email protected]".

Метод unapply можно считать обратной операцией метода apply: unapply принимает объект, а затем извлекает из него значения, которые обычно используются для создания значения объекта. В примере мы используем Метод unapply извлекает имя пользователя и суффикс электронной почты из объекта.

В примере метод unapply возвращает None, если传入ая строка не является адресом электронной почты. Пример кода следующий:

unapply("[email protected]") равна Some("Zara", "gmail.com")
unapply("Zara Ali") равна None

Экстракторы используют моделирование шаблонов

Когда мы создаем экземпляр класса, мы можем передать 0 или несколько параметров, компилятор вызывает метод apply при создании экземпляра. Мы можем определить метод 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!