SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
Patterns
Special unapply 
class A { 
def _1: Int = 1 
def _2: String = "text" 
} 
class B { 
def isEmpty = false 
def get = new A 
} 
object K { 
def unapply(s: String): B = 
new B 
} 
"text" match { 
case K(i, s) => 
println(i, s) 
}
Case classes more 
Теперь понятнее, что же на самом деле 
дает case class: 
case class Person(name: String) 
val ivan = Person("ivan") 
ivan.name 
ivan match { 
case Person(name) => 
}
Multiline strings 
Многострочные литералы: 
val s = 
""" 
|Some text. 
|<- This is margin. 
|It will be stripped below. 
""".stripMargin
Interpolated strings 
Можно использовать разные 
интерполяторы. Дефолтные - это s и f: 
val name = "Alexander" 
val city = "Saint-Petersburg" 
s"My name is $name. I live in $city." 
val height = 1.8311d 
f"$name%s’s height is $height%2.2f"
Regular expressions 
val Decimal = """(-)?(d+)(.d*)?""".r 
"1.0" match { 
case Decimal(sign, i, d) => 
case _ => 
} 
val Decimal(sign, i, d) = "1.0" 
val iterator = Decimal findAllIn "1.0 and 2.0, 33" 
for (Decimal(sign, i, d) <- iterator) { 
println(i) 
}
unapplySeq 
object ListLike { 
def unapplySeq[T](l: List[T]): Option[Seq[T]] = 
Some(l) 
} 
List(1, 2, 3) match{ 
case ListLike(1, xs@_*) => 
println(xs) 
case _ => 
}
Other patterns 
object ** { 
def unapply(t: (Int, Int)): Some[(Int, Int)] = Some(t) 
} 
val x, y: Int = 1 
(x, y) match { 
case (1, 2) | (2, 1) => 
case 1 ** 1 => 
}
Pattern guards 
Можно накладывать условия на case clause: 
val x, y: Int = 1 
(x, y) match { 
case (a, b) if a == b => 
case _ => 
}
Scopes 
Scopes - это место в коде, где может быть 
объявлена переменная. 
● { - начинает новый scope, кроме классов 
● Каждый генератор в for statement начинает 
новый scope 
● Функция начинает новый scope для 
параметров 
● Case clause начинает новый scope 
Переменная объявленная внутри одного scope 
не видна снаружи.
Names shadowing 
Во внутреннем scope можно скрывать имя 
определенное во внешнем scope при условии, 
что приоритет этого имени не ниже чем у имени 
объявленного снаружи. 
Это ошибка объявить переменные с одним 
именем внутри одного и того же scope. 
Существует два вида имен: expressions, types.
Implicits
Implicit conversions 
Преследует две главные цели: 
● Extension methods 
● DSL languages 
Позволяет неявно в коде конвертировать 
один тип в другой.
Implicit conversions 
Простейшие примеры: 
class RichString(s: String) { 
def double: String = s + s 
} 
implicit def s2r(s: String): RichString = new RichString(s) 
"text".double 
val r: RichString = "text" 
"""^[^d].*""".r
Implicit classes 
В Scala 2.10 есть более простой вариант: 
implicit class RichString(s: String) { 
def double: String = s + s 
} 
"text".double
Value classes 
Performance overhead на удаление в GC 
новых объектов существенный. Поэтому для 
extension methods можно сделать так: 
implicit class RichString(val s: String) 
extends AnyVal { 
def double: String = s + s 
} 
"text".double
Implicits search 
1. Сначала ищем в scope 
2. Если не нашли, то расширяем scope с 
помощью companion objects частей типа, 
для которого ищем конверсию
How to debug implicits? 
Неявно это хорошо, когда все работает. 
Что делать, если не работает: 
● -Xprint:typer параметр для компилятора 
● IntelliJ IDEA view implicits tools
Magnet pattern 
Пример использования implicits: 
● Нет проблемы с type erasure для 
перегруженных методов 
● Автоматически выносится общая часть 
для перегруженных методов 
● Использование функциональных типов с 
перегрузкой
Homework 
Написать интерпретируемый язык программирования. Синтаксис и 
все остальное дело вашего вкуса. Базовая спецификация 
следующая: 
1. Динамически типизируемый. У целых и вещественных чисел нет 
переполнения. 
2. Можно объявлять целые, вещественные и стоковые литералы. 
3. Можно объявлять переменные и функции. В функциях можно 
задавать значения по умолчанию. 
4. Можно эти переменные и функции вызывать. 
5. Можно создавать структуры без наследования. Просто данные, 
и возможно какие-то методы.

Mais conteúdo relacionado

Mais procurados

Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 МетодыDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функцийDEVTYPE
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularitiesmcroitor
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3Ann Eres
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторыDEVTYPE
 
javascript_part1
javascript_part1javascript_part1
javascript_part1sovest
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-выводDEVTYPE
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введениеmcroitor
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызововDEVTYPE
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4Zhanna Kazakova
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 

Mais procurados (19)

Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularities
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
Obj c
Obj cObj c
Obj c
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 

Destaque

Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Alexander Podkhalyuzin
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераCodeFest
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Alexander Podkhalyuzin
 
Самурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаСамурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаSergey Lobin
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlangYuri Zhloba
 
Переход на Scala: босиком по граблям
Переход на Scala: босиком по граблямПереход на Scala: босиком по граблям
Переход на Scala: босиком по граблямSveta Bozhko
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 

Destaque (20)

Scala #3
Scala #3Scala #3
Scala #3
 
Scala magic
Scala magicScala magic
Scala magic
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Scala training
Scala trainingScala training
Scala training
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Erlang
ErlangErlang
Erlang
 
Scala #2
Scala #2Scala #2
Scala #2
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
 
Lec 2
Lec 2Lec 2
Lec 2
 
Scala #5
Scala #5Scala #5
Scala #5
 
Feature suggester
Feature suggesterFeature suggester
Feature suggester
 
Самурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаСамурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программиста
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
 
Переход на Scala: босиком по граблям
Переход на Scala: босиком по граблямПереход на Scala: босиком по граблям
Переход на Scala: босиком по граблям
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 

Semelhante a Scala #4

Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Типы данных
Типы данныхТипы данных
Типы данныхMonsterXX
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellFProg
 
Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в DartSergey Penkovsky
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruAlexander Shcherbinin
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
OOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene KaloshaOOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene KaloshaRostyslav Siryk
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 

Semelhante a Scala #4 (20)

Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Типы данных
Типы данныхТипы данных
Типы данных
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
 
Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в Dart
 
Scala for android
Scala for androidScala for android
Scala for android
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Scala
ScalaScala
Scala
 
OOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene KaloshaOOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene Kalosha
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Bytecode
BytecodeBytecode
Bytecode
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Scala on android
Scala on androidScala on android
Scala on android
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 

Scala #4

  • 2. Special unapply class A { def _1: Int = 1 def _2: String = "text" } class B { def isEmpty = false def get = new A } object K { def unapply(s: String): B = new B } "text" match { case K(i, s) => println(i, s) }
  • 3. Case classes more Теперь понятнее, что же на самом деле дает case class: case class Person(name: String) val ivan = Person("ivan") ivan.name ivan match { case Person(name) => }
  • 4. Multiline strings Многострочные литералы: val s = """ |Some text. |<- This is margin. |It will be stripped below. """.stripMargin
  • 5. Interpolated strings Можно использовать разные интерполяторы. Дефолтные - это s и f: val name = "Alexander" val city = "Saint-Petersburg" s"My name is $name. I live in $city." val height = 1.8311d f"$name%s’s height is $height%2.2f"
  • 6. Regular expressions val Decimal = """(-)?(d+)(.d*)?""".r "1.0" match { case Decimal(sign, i, d) => case _ => } val Decimal(sign, i, d) = "1.0" val iterator = Decimal findAllIn "1.0 and 2.0, 33" for (Decimal(sign, i, d) <- iterator) { println(i) }
  • 7. unapplySeq object ListLike { def unapplySeq[T](l: List[T]): Option[Seq[T]] = Some(l) } List(1, 2, 3) match{ case ListLike(1, xs@_*) => println(xs) case _ => }
  • 8. Other patterns object ** { def unapply(t: (Int, Int)): Some[(Int, Int)] = Some(t) } val x, y: Int = 1 (x, y) match { case (1, 2) | (2, 1) => case 1 ** 1 => }
  • 9. Pattern guards Можно накладывать условия на case clause: val x, y: Int = 1 (x, y) match { case (a, b) if a == b => case _ => }
  • 10. Scopes Scopes - это место в коде, где может быть объявлена переменная. ● { - начинает новый scope, кроме классов ● Каждый генератор в for statement начинает новый scope ● Функция начинает новый scope для параметров ● Case clause начинает новый scope Переменная объявленная внутри одного scope не видна снаружи.
  • 11. Names shadowing Во внутреннем scope можно скрывать имя определенное во внешнем scope при условии, что приоритет этого имени не ниже чем у имени объявленного снаружи. Это ошибка объявить переменные с одним именем внутри одного и того же scope. Существует два вида имен: expressions, types.
  • 13. Implicit conversions Преследует две главные цели: ● Extension methods ● DSL languages Позволяет неявно в коде конвертировать один тип в другой.
  • 14. Implicit conversions Простейшие примеры: class RichString(s: String) { def double: String = s + s } implicit def s2r(s: String): RichString = new RichString(s) "text".double val r: RichString = "text" """^[^d].*""".r
  • 15. Implicit classes В Scala 2.10 есть более простой вариант: implicit class RichString(s: String) { def double: String = s + s } "text".double
  • 16. Value classes Performance overhead на удаление в GC новых объектов существенный. Поэтому для extension methods можно сделать так: implicit class RichString(val s: String) extends AnyVal { def double: String = s + s } "text".double
  • 17. Implicits search 1. Сначала ищем в scope 2. Если не нашли, то расширяем scope с помощью companion objects частей типа, для которого ищем конверсию
  • 18. How to debug implicits? Неявно это хорошо, когда все работает. Что делать, если не работает: ● -Xprint:typer параметр для компилятора ● IntelliJ IDEA view implicits tools
  • 19. Magnet pattern Пример использования implicits: ● Нет проблемы с type erasure для перегруженных методов ● Автоматически выносится общая часть для перегруженных методов ● Использование функциональных типов с перегрузкой
  • 20. Homework Написать интерпретируемый язык программирования. Синтаксис и все остальное дело вашего вкуса. Базовая спецификация следующая: 1. Динамически типизируемый. У целых и вещественных чисел нет переполнения. 2. Можно объявлять целые, вещественные и стоковые литералы. 3. Можно объявлять переменные и функции. В функциях можно задавать значения по умолчанию. 4. Можно эти переменные и функции вызывать. 5. Можно создавать структуры без наследования. Просто данные, и возможно какие-то методы.