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 как сценарий

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
 

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 рассматривается как «основной метод».

2.11.0

Отложенная инициализация

В официальной документации App использует функцию « Задержка инициализации» . Это означает, что поля объекта инициализируются после вызова основного метода.

2.11.0

Отложенная инициализация

В официальной документации App использует функцию « Задержка инициализации» . Это означает, что поля объекта инициализируются после вызова основного метода.

DelayedInit теперь устарел для общего использования, но по- прежнему поддерживается App как особый случай. Поддержка будет продолжаться до тех пор, пока не будет решена и не будет реализована функция замены.

Чтобы получить доступ к аргументам командной строки при расширении App , используйте this.args :

object HelloWorld extends App {
  println("Hello World!")
  for {
    arg <- this.args
  } println(s"Arg=$arg")
}
 

При использовании App тело объекта будет выполняться как main метод, нет необходимости переопределять main .

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 {
x <- Seq(1,2,3)
y <- Seq(4,5,6)
} print(x + ":" + y)
Для каждого элемента списка выполните функцию List(1,2,3).foreach { println }
Печатать до стандартного print("Ada Lovelace")
Сортировка списка по алфавиту List('b','c','a').sorted

Использование 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: вы можете определять функции, классы, методы и т. Д.