English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Извлекатель извлекает параметры, необходимые для создания объекта, из переданного ему объекта.
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!