View
2.001
Download
0
Category
Preview:
DESCRIPTION
Citation preview
введение
Коротко о 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)
Коротко о Scala
Интеграция объектно-ориентированного и функционального программирования: Java, Haskell, Erlang, Smalltalk, Scheme
Всё – объекты, нет примитивных типов
Функции – тоже объекты
1+2 на самом деле (1).+(2)true.toString в результате даёт "true"
var average = (x: Int, y: Int) => (x + y) / 2average(3, 6) – вызов функции из переменной
Коротко о 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!)
Интерпретатор и компилятор
Скрипты – получение результата
Программы – описание действий
scala – интерпретатор скриптов и программ
scalac – компилятор программ
$ cat hello.scalaprintln("Hello " + args(0) + "!")$ scala hello.scala worldHello world!$
Переменные и константы
Переменные (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)
Переменные и константы
Предпочтение неизменяемых объектов
Предпочтение методов без побочных эффектов
Предпочтение рекурсии циклам (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))
Условия и циклы
Условия: 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
Классы и объекты
class и object (singleton)
Пары связанных классов и объектов
Независимые объекты
Точка входа в программу
object App {def main(args: Array[String]): Unit = {
for (arg <- args) {println(arg)
}}
}
Универсальный источник
scala.io.Source – одинаковая работа с разными типами источников данных
fromString()
fromIterable()
fromPath()
fromURL()
getWeather(Source.fromURL("http://www.ilm.ee/tallinn")
)getWeather(Source.fromPath("tallinn.html"))
Выбор и регулярные выражения
Простой выбор – константы
Выбор с переменными
data match {case 10 => "number"case "dollars" => "string"case _ => "other"
}
data match {case 10 => "number"case "dollars" => "string"case other => "other: " + other
}
Выбор и регулярные выражения
Использование 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 + ")")}
}
Массивы и списки
Array – фиксированный размер, изменяемое содержимое
List – неизменная последовательность
Операторы обработки списков: :: и :::
ArrayBuffer и ListBuffer как временная замена для интенсивных модификаций
val modern = List("red", "yellow", "green")val classic = "black" :: "white" :: Nil(classic ::: modern).foreach(println)
Ссылки и литература
http://www.scala-lang.org/
Programming in Scala (2008): Martin Odersky
Beginning Scala (2009): David Pollak (Lift)
Recommended