2. If I were to pick a language to use today other
than Java, it would be Scala
James Gosling
I can honestly say if someone had shown me the
Programming in Scala book by by Martin
Odersky, Lex Spoon & Bill Venners back in 2003
I’d probably have never created Groovy
James Strachan
3. возникновение
• Разработан в 20012004 годах (представлен в 2004 г.) в
Лаборатории методов программирования EPFL
(Федеральная политехническая школа Лозанны,
Швейцария) под руководством Мартина Одерски (Martin
Odersky)
• Большое влияние оказали исследовательские работы в
области разработки (компонентного) ПО, ЯП
• Попытка разработки языка, который бы хорошо
масштабировался (SCAlable LAnguage)
• Унификация объектноориентированного и
функционального подходов и предоставление их в языке
со статической типизацией. Расширенные механизмы
абстракции, композиции и декомпозиции
• Хорошая интеграция с существующими платформами и
библиотеками — изначальная ориентация на совместную
работу с Java и .NET
4. «академический» язык
• LinkedIn – фреймфорк “Norbert” для построения
асинхронных, кластерных, высоконагруженных
приложений. Представление социального графа
• EDF – крупнейшая во Франции энергетическая компания
• Twitter – главная очередь сообщений (message queue)
• Novell – сервис “Vibe Cloud”, предоставляющий
корпоративную закрытую и защищенную платформу для
совместной работы
• The Guardian – API для “Open Platform”, предоставление
доступа к медийному архиву агенства
• Xerox – различное ПО, включая и клиентское
• FourSquare – полностью все предоставляемые сервисы
• Sony – система управления хранением данных
• Siemes (+ SAP) – корпоративная система сообщений
• …
5. основные концепции
• Бесшовная интеграция с Javaкодом (C#/.NET)
• Единообразная объектная модель – любое значение
является объектом, любая операция – вызов метода
• Функциональный язык – функции являются полноправными
значениями. Каждая функция возвращает значение
• Механизмы абстракций как для типов, так и для значений
• Использование «примесей» (mixin, trait) для композиции
классов
• Сравнение с образцом (pattern matching)
• Естественная обработка документов XML
• Выведение типов
• Неизменяемые (immutable types) типы
• Ленивые (lazy) вычисления
6. hello world!
Вариант I:
object Application {
def main(args: Array[String]): Unit = {
for (arg < args) {
if (arg.startsWith(""))
println(arg)
}
}
}
7. hello world!
Вариант I:
object Application {
def main(args: Array[String]): Unit = {
for (arg < args) {
if (arg.startsWith(""))
println(arg)
}
}
}
Вариант II:
def main(args: Array[String]): Unit = {
for (arg < args; if arg.startsWith(""))
println(arg)
}
8. hello world!
Вариант I:
object Application {
def main(args: Array[String]): Unit = {
for (arg < args) {
if (arg.startsWith(""))
println(arg)
}
}
}
Вариант II:
def main(args: Array[String]): Unit = {
for (arg < args; if arg.startsWith(""))
println(arg)
}
Вариант III:
def main(args: Array[String]): Unit = {
args.withFilter(_.startsWith("")).map(println)
}
9. значения и переменные
val a: Int = 5
val b = {
println("Init b")
10
}
var c = 15
lazy val d = {
println("Init d")
a + c
}
println("a:%d b:%d c:%d".format(a, b, c))
c = 20
println("c:%d d:%d".format(c, d))
println("d:" + d)
>>> Init b
a:5 b:10 c:15
Init d
c:20 d:25
d:25
10. классы и объекты
class Parent(value: String) {
val classValue = value
}
class A1 {
val a: Int = 0
private var b = 0
def getB = b
}
object A1 extends Parent("Object A1: ") {
def setA(obj: A1) { obj.b = 5 }
}
object Application extends Application {
val obj = new A1
A1.setA(obj)
println(A1.classValue + obj.getB)
}
>>> Object A1: 5
11. трейты (traits)
trait Role {
def getRole: Int
def isAdmin = if (getRole == 0) true else false
}
trait Info {
def getInfo: String
def setInfo(info: String)
}
class User(role: Int) extends Role with Info {
val userRole = role
var userInfo: String = ""
def getRole = userRole
def getInfo = userInfo
def setInfo(info: String) {
userInfo = info
}
}
13. карринг
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
if (xs.isEmpty) Nil
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
else filter(xs.tail, p)
def modN(n: Int)(x: Int) = ((x % n) == 0)
val list = (1 to 10).toList
println(filter(list, modN(2)))
println(filter(list, modN(3)))
>>> List(2, 4, 6, 8, 10)
List(3, 6, 9)
14. xml
val xml =
<depot>
<item name="item 1">
<part name="part 1"/>
<part name="part 2"/>
<item>inner item</item>
</item>
<item name="item 2"></item>
<label type="title">Depot title</label>
</depot>
xml "item"
xml "item"
xml "@type"
15. xml
val ptype = "box"
val title = "Examples"
val item = <item type={ ptype }>{ title }</item>
val items =
<items>
{for (index < (0 to 3).toList)
yield <item>{ index }</item>}
</items>
println(item)
println(items)
>>> <item type="box">Examples</item>
<items>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</items>
16. сравнение с образцом
def matcher(x: Any) = {
x match {
case 1 => println("Integer value 1")
case y: Int => println("Integer value: " + y)
case <e>{ tagValue }</e> =>
println("XML Tag value: " + tagValue)
case _ => println("Something else: " + x)
}
}
matcher(1)
matcher(10)
matcher(<e>Lorem ipsum</e>)
matcher("simple string")
>>> Integer value 1
Integer value: 10
XML Tag value: Lorem ipsum
Something else: simple string
17. магический implicit
implicit def double2int(x: Double) = {
println("converting double to int ...")
if (x < 10) 0 else x.toInt
}
val i: Int = 3.5
println(i)
>>> converting double to int ...
0
implicit val a: Int = 10
implicit val b: Double = 1.5
def foo(implicit a: Int, b: Double) = {
println("%d, %f".format(a, b))
}
foo
>>> 10, 1.500000
18. The first rule of Lift is:
It's easier than you think.
I think the most important feature we have in
Lift is the community around it
(committers and noncommitters). I have joined
the mailing list just a few months
ago and I am impressed with how willing
everyone is to help each other.
19. общая информация
• Разработка начата в 2007 году, сейчас достигнута
версия 2.2. Главный разработчик — Девид Поллак (David
Pollak). Рабочее название было “Scala on Sails”
• Разрабатывается с целью объединить лучшие идеи и
концепции из существующих webфреймворков (Java
фреймворки, RoR)
• Концентрация на бизнеслогике приложения
• Простая и эффективная система безопасности
• Использование преимуществ Scala как базового языка
(контроль типов, встроенная обработка XML,
функциональные элементы)
• ViewFirst предпочтительнее MVCмодели
• Изначальная поддержка AJAX и Comet
• Используется в таких компаниях, как Nowell, SAP,
Innovation Games, Foursquare, Untyped и другими
24. mapper orm
Создание записи:
val n = News.create
n.title("Lorem ipsum")
…
n.save
Удаление записи:
n.delete_!
Все записи:
val n = News.findAll
Записи по условию:
val n = News.findAll(By(News.publish, true),
OrderBy(News.date, Descending),
StartAt(0), MaxRows(10))
Записи по SQLзапросу:
val n = News.findAllByInsecureSql("select * from news " +
"where publish = 1 order by(date_c)",
IHaveValidatedThisSQL("dba", "20110101"))
25. menu
Boot.scala:
import net.liftweb.http.LiftRules
import net.liftweb.sitemap.Loc
import net.liftweb.sitemap.Loc.Hidden
import net.liftweb.sitemap.Loc.strLstToLink
import net.liftweb.sitemap.Menu
import net.liftweb.sitemap.SiteMap
...
def boot {
...
val myLoc = Loc("HomePage", "index" :: Nil, "Home Page",
Hidden)
val myMenu = Menu(myLoc)
val allMenus = myMenu :: User.sitemap
val mySiteMap = SiteMap(allMenus: _*)
LiftRules.setSiteMap(mySiteMap)
...