introduction to scala by eduard shustrov
DESCRIPTION
TRANSCRIPT
![Page 1: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/1.jpg)
введение
![Page 2: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/2.jpg)
Коротко о Scala
A Scalable Language
Автор – prof. Martin Odersky (Java Generics)
Разработка в EPFL началась с 2001 года
Версия 1.0 появилась в 2003 году
Компилятор генерирует Java byte code
Объём исходников в 2-3 раза меньше Java
От скриптов до enterprise систем:Twitter, Électricité de France, Siemens (+Lift)
![Page 3: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/3.jpg)
Коротко о Scala
Интеграция объектно-ориентированного и функционального программирования: Java, Haskell, Erlang, Smalltalk, Scheme
Всё – объекты, нет примитивных типов
Функции – тоже объекты
1+2 на самом деле (1).+(2)true.toString в результате даёт "true"
var average = (x: Int, y: Int) => (x + y) / 2average(3, 6) – вызов функции из переменной
![Page 4: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/4.jpg)
Коротко о Scala
Статическая типизация
Переопределение операторов
Классы по удобству как встроенные типы
implicit def toMyInt(x: Int) = new MyInt(x)class MyInt(x: Int) {
private val num = xdef - (x: Int): MyInt = num - xdef * (x: Int): MyInt = num * xdef ! : MyInt = if (num == 0) 1
else ((this - 1)!) * numoverride def toString = num.toString}
println(10!)
![Page 5: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/5.jpg)
Интерпретатор и компилятор
Скрипты – получение результата
Программы – описание действий
scala – интерпретатор скриптов и программ
scalac – компилятор программ
$ cat hello.scalaprintln("Hello " + args(0) + "!")$ scala hello.scala worldHello world!$
![Page 6: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/6.jpg)
Переменные и константы
Переменные (var) и константы (val )
Отложенная инициализация (lazy val)
Предпочтение констант переменным
class LazyTest {lazy val coef: MyInt = {println("coef");
15!}def foo() = println("foo()")
}val test = new LazyTesttest.foo()println(test.coef)
![Page 7: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/7.jpg)
Переменные и константы
Предпочтение неизменяемых объектов
Предпочтение методов без побочных эффектов
Предпочтение рекурсии циклам (tail-call)
Локализация переменныхdef pi(appr: Double, i: Int): Double = {
val delta = 4.0 / (2 * i + 1)if (delta < 0.0000001) apprelse if (i % 2 == 0) pi(appr + delta, i + 1)else pi(appr - delta, i + 1)}
println(pi(0, 0))
![Page 8: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/8.jpg)
Условия и циклы
Условия: if и if-else
Циклы: while, do-while, for
Метод foreachargs.foreach(arg => println(arg + "..."))
for (val i <- 1 to 100 if i % 7 == 0) {println(i)
}
val test = if (i % 3 == 0) i else 0
![Page 9: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/9.jpg)
Классы и объекты
class и object (singleton)
Пары связанных классов и объектов
Независимые объекты
Точка входа в программу
object App {def main(args: Array[String]): Unit = {
for (arg <- args) {println(arg)
}}
}
![Page 10: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/10.jpg)
Универсальный источник
scala.io.Source – одинаковая работа с разными типами источников данных
fromString()
fromIterable()
fromPath()
fromURL()
getWeather(Source.fromURL("http://www.ilm.ee/tallinn")
)getWeather(Source.fromPath("tallinn.html"))
![Page 11: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/11.jpg)
Выбор и регулярные выражения
Простой выбор – константы
Выбор с переменными
data match {case 10 => "number"case "dollars" => "string"case _ => "other"
}
data match {case 10 => "number"case "dollars" => "string"case other => "other: " + other
}
![Page 12: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/12.jpg)
Выбор и регулярные выражения
Использование Regex при выборе
val Filename = """File:\s*(.*)\s*""".rval Tag = """\s+([\S:]*):\s*([\d\.]*)\s*""".r
for (line <- source.getLines()) {line match {
case Filename(file) =>println("File: '" + file + "'")
case Tag(tagName, tagNumber) =>println("Tag: '" + tagName + "'" +
" (" + tagNumber + ")")}
}
![Page 13: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/13.jpg)
Массивы и списки
Array – фиксированный размер, изменяемое содержимое
List – неизменная последовательность
Операторы обработки списков: :: и :::
ArrayBuffer и ListBuffer как временная замена для интенсивных модификаций
val modern = List("red", "yellow", "green")val classic = "black" :: "white" :: Nil(classic ::: modern).foreach(println)
![Page 14: Introduction to Scala by Eduard Shustrov](https://reader036.vdocuments.us/reader036/viewer/2022081907/5455f645af795998788b4b4c/html5/thumbnails/14.jpg)
Ссылки и литература
http://www.scala-lang.org/
Programming in Scala (2008): Martin Odersky
Beginning Scala (2009): David Pollak (Lift)