9. Scala
● Статическая строгая типизация
● Смешанная парадигма (ООП+Функциональная)
● JVM и .NET
● Сложная система типов
○ inference
● Scalable
○ explicit selftypes
○ abstract type members and generics
○ nested methods and classes
○ mixin composition using traits
○ dependency injection
10. Scala
● Всё является объектами
● def - начало определения метода
● Определение переменных начинается с ключевых
слов var или val
■ val array: Array[String] = new Array(5)
● Переменные определяются как имя:тип
● Точки с запятой необязательны
11. Scala - ООП
class Upper {
def upper(strings: String*): Seq[String] = {
strings.map((s:String) => s.toUpperCase())
}
}
val up = new Upper
Console.println(up.upper("A", "First", "Scala", "Program"))
12. Scala - Functional
// Функциональный литерал
(s:String) => s.toUpperCase()
// Пример применения
object Upper {
def upper(strings: String*) = strings.map(_.toUpperCase())
}
println(Upper.upper("A", "First", "Scala", "Program"))
// _ - это Placeholder-индикатор, можно представить как анонимную
переменную, которая
// принимает в качестве значения строки из map'a
13. Scala - Functional
def factorial(i: Int): Int = {
def fact(i: Int, accumulator: Int): Int = {
if (i <= 1)
accumulator
else
fact(i - 1, i * accumulator)
}
fact(i, 1)
}
def countTo(n: Int):Unit = {
def count(i: Int): Unit = {
if (i <= n) {
println(i)
count(i + 1)
}
}
count(1)
}
countTo(5)
14. Scala - Type Inference
import java.util.Map;
import java.util.HashMap;
...
Map<Integer, String> intToStringMap = new HashMap<Integer, String>();
import java.util.Map
import java.util.HashMap
...
val intToStringMap: Map[Integer, String] = new HashMap
import java.util.Map
import java.util.HashMap
...
val intToStringMap2 = new HashMap[Integer, String]
15. Scala - Type Inference
Когда нужно явно указать тип
1. При объявлении переменной, если при этом ей не присваивается
значение. (e.g., val name = "Programming Scala")
2. Для любого параметра метода. (e.g., def deposit(amount: Money)…)
3. Для возвращаемых значений метода в случае:
a. Когда вы явно вызываете return.
b. Когда метод рекурсивен.
c. При перегрузке метода, в случае если один вызывает другой.
d. В случае, когда возвращаемый тип является более общим, чем
вам нужно, e.g., Any.
16. Scala - Actors/package shapes {
class Point(val x: Double, val y: Double) {
override def toString() = "Point(" + x + "," + y + ")"
}
abstract class Shape() {
def draw(): Unit
}
class Circle(val center: Point, val radius: Double) extends Shape {
def draw() = println("Circle.draw: " + this)
override def toString() = "Circle(" + center + "," + radius + ")"
}
class Rectangle(val lowerLeft: Point, val height: Double, val width: Double)
extends Shape {
def draw() = println("Rectangle.draw: " + this)
override def toString() =
"Rectangle(" + lowerLeft + "," + height + "," + width + ")"
}
class Triangle(val point1: Point, val point2: Point, val point3: Point)
extends Shape {
def draw() = println("Triangle.draw: " + this)
override def toString() =
"Triangle(" + point1 + "," + point2 + "," + point3 + ")"
}
}
17. Scala - Actors
package shapes {
import scala.actors._
import scala.actors.Actor._
object ShapeDrawingActor extends Actor {
def act() {
loop {
receive {
case s: Shape => s.draw()
case "exit" => println("exiting..."); exit
case x: Any => println("Error: Unknown message! " + x)
}
}
}
}
}
18. Scala - Actors
import shapes._
ShapeDrawingActor.start()
ShapeDrawingActor ! new Circle(new Point(0.0,0.0), 1.0)
ShapeDrawingActor ! new Rectangle(new Point(0.0,0.0), 2, 5)
ShapeDrawingActor ! new Triangle(new Point(0.0,0.0),
new Point(1.0,0.0),
new Point(0.0,1.0))
ShapeDrawingActor ! 3.14159
ShapeDrawingActor ! "exit"
19. Play! 2
● Full-stack MVC фреймворк
● Асинхронный
● Событийно-ориентированный
● Stateless
● Type-safe
● Масштабируемый
● Open Source
● Поддерживает Scala и Java
20. Play! 2
● Компиляция в реальном времени
● Интерактивная консоль
● Отображение ошибок в браузере и в консоли
● Db Evolutions ~= Миграции
● Компиляция всего
22. Play! - Getting started
Способ 1:
1. Скачать и распаковать Play
2. Добавить местоположение в переменную окружения
export PATH=$PATH:/relativePath/to/play
3. Скомандовать
play new myFirstApp
23. Play! - Getting started
Способ 2 (предпочтительный):
1. Установить sbt (Scala Build tool) и добавить в project/plugins.sbt
// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.0")
import sbt._
import Keys._
import play.Project._
2. В project/Build.scala добавить
object ApplicationBuild extends Build {
val appName = "My first application"
val appVersion = "1.0"
val appDependencies = Nil
val main = play.Project(
appName, appVersion, appDependencies
)
}