Scala Language учебник
Начало работы с языком Scala
Поиск…
замечания
Scala - это современный язык программирования с несколькими парадигмами, предназначенный для выражения общих шаблонов программирования в краткой, элегантной и безопасной форме. Он плавно интегрирует функции объектно-ориентированного и функционального языков.
Для большинства приведенных примеров требуется рабочая установка Scala. Это страница установки Scala , и это пример «Как настроить Scala» . scalafiddle.net - хороший ресурс для выполнения небольших примеров кода через Интернет.
Версии
Версия | Дата выхода |
---|---|
2.10.1 | 2013-03-13 |
2.10.2 | 2013-06-06 |
2.10.3 | 2013-10-01 |
2.10.4 | 2014-03-24 |
2.10.5 | 2015-03-05 |
2.10.6 | 2015-09-18 |
2.11.0 | 2014-04-21 |
2.11.1 | 2014-05-21 |
2.11.2 | 2014-07-24 |
2.11.4 | 2014-10-30 |
2.11.5 | 2014-01-14 |
2.11.6 | 2015-03-05 |
2.11.7 | 2015-06-23 |
2.11.8 | 2016-03-08 |
2.11.11 | 2017-04-19 |
2.12.0 | 2016-11-03 |
2.12.1 | 2016-12-06 |
2.12.2 | 2017-04-19 |
Hello World, определяя «основной» метод
Поместите этот код в файл HelloWorld.scala
:
object Hello {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
Чтобы скомпилировать его в байт-код, исполняемый JVM:
$ scalac HelloWorld.scala
Чтобы запустить его:
$ scala Hello
Когда среда выполнения Scala загружает программу, она ищет объект с именем Hello
с main
методом. main
метод - это точка входа в программу и выполняется.
Обратите внимание, что в отличие от Java, у Scala нет требования об именовании объектов или классов после файла, в котором они находятся. Вместо этого параметр Hello
переданный в команде scala Hello
ссылается на объект для поиска, содержащий main
метод, который должен быть выполнен. В одном файле .scala
вполне возможно иметь несколько объектов с основными методами.
Массив args
будет содержать аргументы командной строки, заданные программе, если таковые имеются. Например, мы можем изменить программу следующим образом:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!")
for {
arg <- args
} println(s"Arg=$arg")
}
}
Скомпилируйте его:
$ scalac HelloWorld.scala
И затем выполните его:
$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3
Hello World, расширяя приложение
object HelloWorld extends App {
println("Hello, world!")
}
Расширяя черту App
, вы можете избежать определения явного main
метода. Весь объект HelloWorld
рассматривается как «основной метод».
Отложенная инициализация
В официальной документации
App
использует функцию « Задержка инициализации» . Это означает, что поля объекта инициализируются после вызова основного метода.
Отложенная инициализация
В официальной документации
App
использует функцию « Задержка инициализации» . Это означает, что поля объекта инициализируются после вызова основного метода.
DelayedInit
теперь устарел для общего использования, но по- прежнему поддерживаетсяApp
как особый случай. Поддержка будет продолжаться до тех пор, пока не будет решена и не будет реализована функция замены.
Чтобы получить доступ к аргументам командной строки при расширении App
, используйте this.args
:
object HelloWorld extends App {
println("Hello World!")
for {
arg <- this.args
} println(s"Arg=$arg")
}
При использовании App
тело объекта будет выполняться как main
метод, нет необходимости переопределять main
.
Hello World как сценарий
Scala может использоваться как язык сценариев. Чтобы продемонстрировать, создайте HelloWorld.scala
со следующим содержимым:
println("Hello")
Выполните его с помощью интерпретатора командной строки ( $
- приглашение командной строки):
$ scala HelloWorld.scala
Hello
Если вы опустите .scala
(например, если вы просто набрали scala HelloWorld
), бегун будет искать скомпилированный файл .class
с байт-кодом вместо компиляции и последующего выполнения скрипта.
Примечание. Если scala используется как язык сценариев, пакет не может быть определен.
В операционных системах, использующих bash
или аналогичные терминалы оболочки, скрипты Scala могут быть выполнены с использованием «преамбулы оболочки». Создайте файл с именем HelloWorld.sh
и поместите в него содержимое:
#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")
Части между #!
и !#
является «преамбулой оболочки» и интерпретируется как сценарий bash. Остальное - Скала.
После того как вы сохранили вышеуказанный файл, вы должны предоставить ему «исполняемые» разрешения. В оболочке вы можете сделать это:
$ chmod a+x HelloWorld.sh
(Обратите внимание, что это дает разрешение всем: прочитайте о chmod, чтобы узнать, как установить его для более конкретных наборов пользователей.)
Теперь вы можете выполнить скрипт следующим образом:
$ ./HelloWorld.sh
Использование Scala REPL
Когда вы выполняете scala
в терминале без дополнительных параметров, он открывает интерпретатор REPL (Read-Eval-Print Loop):
nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.
scala>
REPL позволяет выполнять Scala в режиме листа: контекст выполнения сохраняется, и вы можете вручную опробовать команды, не создавая целую программу. Например, набрав val poem = "As halcyons we shall be"
будет выглядеть так:
scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be
Теперь мы можем распечатать наш val
:
scala> print(poem)
As halcyons we shall be
Обратите внимание, что val
неизменен и не может быть перезаписан:
scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
poem = "Brooding on the open sea"
Но в REPL вы можете переопределить val
(что вызовет ошибку в обычной программе Scala, если это было сделано в той же области):
scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea
На оставшуюся часть вашего сеанса REPL эта вновь определенная переменная будет затенять ранее определенную переменную. REPLs полезны для быстрого просмотра того, как работают объекты или другой код. Доступны все возможности Scala: вы можете определять функции, классы, методы и т. Д.
Scala Quicksheet
Описание | Код |
---|---|
Назначить неизменяемую стоимость int | val x = 3 |
Назначить изменяемую стоимость int | var x = 3 |
Назначить неизменяемое значение с явным типом | val x: Int = 27 |
Присвоить лениво оцениваемое значение | lazy val y = print("Sleeping in.") |
Привязать функцию к имени | val f = (x: Int) => x * x |
Привязать функцию к имени с явным типом | val f: Int => Int = (x: Int) => x * x |
Определить метод | def f(x: Int) = x * x |
Определить метод с явным набором текста | def f(x: Int): Int = x * x |
Определить класс | class Hopper(someParam: Int) { ... } |
Определить объект | object Hopper(someParam: Int) { ... } |
Определить черту | trait Grace { ... } |
Получить первый элемент последовательности | Seq(1,2,3).head |
Если переключатель | val result = if(x > 0) "Positive!" |
Получить все элементы последовательности, кроме первых | Seq(1,2,3).tail |
Прокрутите список | for { x <- Seq(1,2,3) } print(x) |
Вложенные петли | for { |
Для каждого элемента списка выполните функцию | List(1,2,3).foreach { println } |
Печатать до стандартного | print("Ada Lovelace") |
Сортировка списка по алфавиту | List('b','c','a').sorted |