14
введение

Introduction to Scala by Eduard Shustrov

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Introduction to Scala by Eduard Shustrov

введение

Page 2: Introduction to Scala by Eduard Shustrov

Коротко о 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

Коротко о 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

Коротко о 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

Интерпретатор и компилятор

Скрипты – получение результата

Программы – описание действий

scala – интерпретатор скриптов и программ

scalac – компилятор программ

$ cat hello.scalaprintln("Hello " + args(0) + "!")$ scala hello.scala worldHello world!$

Page 6: Introduction to Scala by Eduard Shustrov

Переменные и константы

Переменные (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

Переменные и константы

Предпочтение неизменяемых объектов

Предпочтение методов без побочных эффектов

Предпочтение рекурсии циклам (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

Условия и циклы

Условия: 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

Классы и объекты

class и object (singleton)

Пары связанных классов и объектов

Независимые объекты

Точка входа в программу

object App {def main(args: Array[String]): Unit = {

for (arg <- args) {println(arg)

}}

}

Page 10: Introduction to Scala by Eduard Shustrov

Универсальный источник

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

Выбор и регулярные выражения

Простой выбор – константы

Выбор с переменными

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

Выбор и регулярные выражения

Использование 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

Массивы и списки

Array – фиксированный размер, изменяемое содержимое

List – неизменная последовательность

Операторы обработки списков: :: и :::

ArrayBuffer и ListBuffer как временная замена для интенсивных модификаций

val modern = List("red", "yellow", "green")val classic = "black" :: "white" :: Nil(classic ::: modern).foreach(println)