scala — вопросы с ответами

Scala – это язык, который отвечает потребностям современного разработчика программного обеспечения. Это статически типизированный язык JVM со смешанной парадигмой с лаконичным, элегантным и гибким синтаксисом, сложной системой типов и идиомами, обеспечивающими масштабируемость от небольших интерпретируемых сценариев до больших сложных приложений. Но в нескольких словах всю концепцию Scala не описать, поэтому давайте рассмотрим каждую из этих идей более подробно:

  • Язык JVM и JavaScript. Scala использует производительность и оптимизацию JVM, а также богатую экосистему инструментов и библиотек, построенных на Java. Но все это не ограничивается JVM! Scala.js – это экспериментальный порт для JavaScript;
  • Статически типизированный. Scala использует статическую типизацию как инструмент для создания надежных приложений. Он исправляет многие недостатки системы типов Java и использует вывод типов, чтобы исключить большую часть шаблонного набора;
  • Смешанная парадигма – объектно-ориентированное программирование. Scala полностью поддерживает объектно-ориентированное программирование (ООП). Scala улучшает объектную модель Java с добавлением признаков, что является чистым способом реализации типов с использованием смешанных композиций. В Scala все действительно является объектом, даже числовые типы;
  • Смешанная парадигма – функциональное программирование. Scala полностью поддерживает функциональное программирование (FP). FP стал лучшим инструментом для решения проблем параллелизма, больших данных и общей правильности кода. Неизменные значения, первоклассные функции, функции без побочных эффектов, функции "высшего порядка" и коллекции функций – все это способствует получению краткого, мощного и правильного кода;
  • Сложная система типов. Scala расширяет систему типов Java с помощью более гибких обобщений и других усовершенствований для улучшения правильности кода. С выводом типа код Scala зачастую такой же лаконичный, как и код на динамически типизированных языках;
  • Сжатый, элегантный и гибкий синтаксис. Подробные выражения в Java становятся краткими идиомами в Scala. Scala предоставляет несколько средств для создания доменных языков (API), API-интерфейсов, которые уже кажутся «родными» для пользователей;
  • Масштабируемые-архитектуры. Вы можете писать небольшие интерпретируемые сценарии для больших распределенных приложений в Scala. Четыре языковых механизма способствуют масштабируемой композиции систем: 1) смешанная композиция с использованием признаков; 2) члены абстрактного типа и дженерики; 3) вложенные классы; 4) явно указанные собственные типы.

Само название Scala является сокращением от слова «масштабируемый язык».

Важные компоненты

Чтобы как можно быстрее приступить к работе и лично проверить некоторые примеры, которые будут приведены в этой статье, вам понадобится установить и запустить несколько инструментов:

  1. Установка Java. До появления Scala 2.12 можно было использовать Java версии 6, 7 или 8. Но с выходом Scala 2.12 в 2016 году, стал поддерживаться только Java 8. Если вам нужно установить Java, перейдите на веб-сайт Oracle и следуйте инструкциям по установке полного комплекта Java Development Kit (JDK).
  2. Установка SBT. Установите инструмент для сборки Scala (SBT), следуя инструкциям на сайте scala-sbt.org. Когда вы закончите, у вас будет команда sbt, которую вы сможете запустить из терминала Linux или OS X, или же из окна команд Windows.
  3. Запуск SBT. Откройте оболочку или командное окно и перейдите в каталог. Введите команду sbt test, которая загрузит все необходимые зависимости, включая компилятор Scala и сторонние библиотеки. Это займет некоторое время, и вам понадобится подключение к интернету. Затем sbt скомпилирует код и запустит модульные тесты. Вы увидите много выходных данных, заканчивающихся сообщением об успехе. Если вы снова запустите команду, она должна завершиться очень быстро, потому что больше ничего загружать не нужно.

Вот и все, вы готовы к началу работы.

Использование SBT

Детальное изучение SBT может занять много времени, поэтому мы ознакомимся лишь с основными моментами работы в этом инструменте.

Если вы не указываете задачу для запуска при включении команды sbt, он запускает интерактивный REPL (Read, Eval, Print, Loop). Давайте попробуем это сейчас сделать и посмотрим несколько доступных "заданий".

В следующем списке, $ – это командная строка оболочки (например, bash), где вы запускаете команду sbt, > – это интерактивное напоминание SBT по умолчанию, а # запускает комментарий sbt. Вы можете вводить большинство этих команд в любом порядке:

Чтобы продолжать компилировать изменения и запускать соответствующие тесты можно постоянно запускать ~test. SBT использует инкрементный компилятор и тестовый прогон, поэтому вам не нужно каждый раз ждать полной перестройки. Если вы хотите запустить другую задачу или выйти из sbt, просто нажмите Return.

Команда eclipse удобна, если вы используете Eclipse с подключаемым модулем Scala. Он генерирует соответствующие файлы проекта, чтобы вы могли импортировать код как проект Eclipse. Если вы будете использовать Eclipse для работы с примером кода, запустите задачу eclipse прямо сейчас.

Если вы используете недавнюю версию IntelliJ IDEA с подключаемым модулем Scala, вы можете просто импортировать проект SBT напрямую.

Scala имеет свой собственный REPL. Вы можете вызвать его, используя консольную команду:

Когда вы запускаете консоль, SBT сначала строит ваш проект и делает продукты для сборки доступными в CLASSPATH. Следовательно, вы можете экспериментировать со своим кодом, используя REPL.

Примечание: использование Scala REPL – очень эффективный способ экспериментирования с идиомами кода и изучения API (даже API Java). Вызов его из SBT с помощью команды консоли удобно добавляет зависимости проекта и скомпилированный код проекта в путь к классам для REPL.

Синтаксис

Для работы со Scala вы будете чаще всего использовать REPL. Напомним, что вы можете запустить его одним из трех способов: напрямую, используя команду scala без сценария; используя "главный" аргумент при помощи одной из консольных команд SBT; используя функцию рабочего листа в популярных IDE.

Если вы не используете IDE, мы бы рекомендовали вам использовать SBT большую часть времени, особенно когда вы работаете с конкретным проектом. Это то, чем мы здесь и займемся. На самом деле, даже если вы предпочитаете IDE, вам все же стоит попробовать SBT в окне командной строки, просто чтобы посмотреть, как это выглядит. Множество программистов редко используют IDE, но это всего лишь личные предпочтения каждого человека.

В окне оболочки перейдите в корневой каталог примеров кода и запустите sbt. В командной строке> введите console. С этого момента мы опустим некоторые «шаблоны» в выводе sbt и scala.

Введите следующие две строки кода:

Первая строка использует ключевое слово val для объявления неизменяемой переменной с именем book. Рекомендуется использовать неизменяемые значения, потому что изменяемые данные являются распространенным источником ошибок.

Обратите внимание, что результат, полученный от интерпретатора, показывает тип и значение книги. Как правило, когда Scala отклоняется от синтаксиса Java, на это обычно имеются веские причины. Например, поддержка новой функции, которая затруднит использование синтаксиса Java.

Важно: отображение типов в REPL очень удобно для изучения типов, которые Scala выводит для определенных выражений. Это один из примеров преимуществ использования REPL.

Большие примеры могут быть утомительными для редактирования и повторной отправки, используя только REPL. Следовательно, удобно писать скрипты Scala в текстовом редакторе или IDE. Затем вы можете выполнить скрипт или же скопировать и вставить целые блоки кода.

Использование точки с запятой

Точки с запятой являются выводимыми разделителями выражений. Scala обрабатывает конец строки как конец выражения, за исключением случаев, когда он может сделать вывод, что выражение продолжается до следующей строки, как в этом примере:

По сравнению с компилятором, REPL более агрессивен в интерпретации конца строки как конца выражения, поэтому при вводе многострочного выражения безопаснее заканчивать каждую строку (кроме последней) одним из индикаторов, показанных в предыдущем скрипте.

Объявления переменных

Scala позволяет вам решать, является ли переменная неизменной (только для чтения) или нет (для чтения и записи), когда вы объявляете ее. Мы уже видели, что неизменяемая «переменная» объявляется с ключевым словом val (объект Think Value):

Scala похож на Java в том смысле, что большинство переменных на самом деле являются ссылками на динамически создаваемые объекты. Следовательно, ссылка на массив не может быть изменена, чтобы указывать на другой массив, но сами элементы массива являются изменяемыми, поэтому элементы могут быть изменены:

Val должен быть инициализирован, когда он объявлен.

Аналогично, изменяемая переменная объявляется с ключевым словом var, и она также должна быть немедленно инициализирована, даже если она может быть изменена позже, так как она изменчива:

Чтобы было понятнее, мы изменили значение самой stockPrice. Однако «объект», на который ссылается stockPrice, не может быть изменен, потому что Double в Scala неизменны.

В Java так называемые примитивные типы char, byte, short, int, long, float, double и boolean принципиально отличаются от ссылочных объектов. Действительно, нет ни объекта, ни ссылки, просто «сырое» значение. Scala стремится быть последовательно более объектно-ориентированным, поэтому эти типы на самом деле являются объектами с методами, такими как ссылочные типы. Тем не менее, Scala компилируется в примитивы, где это возможно, давая вам преимущество в производительности, которое они предоставляют.

Есть несколько исключений из правила, что вы должны инициализировать значения и значения при их объявлении. Например, любое ключевое слово может использоваться с параметром конструктора, превращая его в поле типа. Он будет неизменным, если используется val, и изменяемым, если используется var.

Рассмотрим следующий сеанс REPL, где мы определяем класс Person с неизменяемыми именами и фамилиями, но с изменяемым возрастом (потому что люди, очевидно, стареют):

Ключевые слова var и val только указывают, можно ли изменить ссылку для ссылки на другой объект (var) или нет (val). Они не указывают, является ли объект, на который они ссылаются, изменчивым.

6 ответов
При запуске интерпретатора Scala в Ubuntu 14.04 я получаю следующее сообщение, напечатанное как первая строка: Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar Далее следует знакомое сообщение "Добро пожаловать в Scala". Я беспокоюсь, потому что я не видел этого при запуске S...
27 сен. 2014, в 12:23
1 ответ
Я обновляю существующий код от Rogue 1.1.8 до 2.0.0 и lift-mongodb-record от 2.4-M5 to 2.5. Мне трудно писать MongoCaseClassField, который содержит перечисление scala, с которым я действительно мог бы сработать. Например, object MyEnum extends Enumeration { type MyEnum = Value val A = Value(0) ...
class
lift
record
07 июнь 2013, в 20:38
5 ответов
Как мне подсказывали, я просмотрел несколько статей, описывающих, как сделать IntelliJ Idea и Android и Scala работать вместе, но оказалось, что все они были написаны 1 или 2 года назад. И, вероятно, с тех пор что-то изменилось, и теперь есть другие решения для достижения этой цели. Конкретно, есть ...
intellij-idea
ide
25 май 2013, в 14:58
15 ответов
Мне нужно построить строку JSON, что-то вроде этого: [ { 'id': 1, 'name': 'John'}, { 'id': 2, 'name': 'Dani'} ] val jArray = JsArray(); jArray += (("id", "1"), ("name", "John")) jArray += (("id", "2"), ("name", "Dani")) println(jArray.dump) Мне нужно иметь возможность добавлять строки в jArray...
08 нояб. 2011, в 16:00
9 ответов
Я просмотрел список опросов, проведенных на scala-lang.org и заметил любопытный вопрос: "Можете ли вы назвать все виды использования "_" ?". Ты можешь? Если да, пожалуйста, сделайте это здесь. Понятные примеры приветствуются.
03 нояб. 2011, в 18:07
13 ответов
Я должен признать, что я мало знаю о функциональном программировании. Я читал об этом здесь и там, и так узнал, что в функциональном программировании функция возвращает тот же вывод для того же ввода, независимо от того, сколько раз функция вызывается. Это точно так же, как математическая функция, к...
haskell
functional-programming
f#
clean-language
01 сен. 2011, в 08:50
7 ответов
Я хотел бы найти совпадение между первой буквой слова и одной из букв в группе, такой как "ABC". В псевдокоде это может выглядеть примерно так: case Process(word) => word.firstLetter match { case([a-c][A-C]) => case _ => } } Но как я могу взять первую букву в Scala вместо...
pattern-matching
08 янв. 2011, в 23:03
12 ответов
Я слышал много бред о Akka framework (платформа услуг Java/Scala), но до сих пор не видел много фактических примеров использования, на которые это было бы полезно. Поэтому мне было бы интересно узнать о том, что разработчики использовали его успешно. Только одно ограничение: пожалуйста, не включайте...
asynchronous
akka
use-case
20 дек. 2010, в 17:46
6 ответов
Я использую сборку в классе JSON в Scala 2.8 для разбора кода JSON. Я не хочу использовать Liftweb один или любой другой из-за минимизации зависимостей. То, как я это делаю, кажется слишком важным, есть ли лучший способ сделать это? import scala.util.parsing.json._ ... val json:Option[Any] = JSON.pa...
13 нояб. 2010, в 04:08
13 ответов
Я искал в Google, чтобы найти различия между case class и class. Все упоминают, что, когда вы хотите выполнить сопоставление образцов в классе, используйте класс case. В противном случае используйте классы, а также упомяните о некоторых дополнительных привилегиях, таких как equals и hash code overri...
functional-programming
case-class
22 фев. 2010, в 18:05
11 ответов
Автотип для признака A: trait B trait A { this: B => } говорит, что "A не может быть смешано с конкретным классом, который также не распространяется на B". С другой стороны, следующее: trait B trait A extends B говорит, что "любое (конкретное или абстрактное) смешивание классов в A также будет ...
traits
self-type
02 янв. 2010, в 07:04
13 ответов
Я просто просматриваю несколько обучающих программ Scala в Интернете и заметил в некоторых примерах, что объект объявлен в начале примера. В чем разница между class и object в Scala?
class
object
18 нояб. 2009, в 09:30
18 ответов
Я только начал смотреть на Scala повторная реализация библиотеки коллекций, которая приближается к ближайшему 2.8 релиз. Те, кто знаком с библиотекой из 2.7, заметят, что библиотека с точки зрения использования мало изменилась. Например... > List("Paris", "London").map(_.length) res0: List[Int] ...
scala-collections
scala-2.8
12 нояб. 2009, в 13:58
6 ответов
Может кто-то объяснить основные различия между Scala, Groovy и Clojure. Я знаю, что каждый из этих компиляций запускается на JVM, но я бы хотел просто провести сравнение между ними.
groovy
clojure
language-comparisons
22 авг. 2009, в 01:50
11 ответов
Это печальный факт жизни в Scala, что если вы создаете экземпляр List [Int], вы можете проверить, что ваш экземпляр является List, и вы можете проверить, что любой его отдельный элемент является Int, но не тот это List [Int], что легко проверить: scala> List(1,2,3) match { | case l : List[St...
type-erasure
07 июль 2009, в 19:22
Наверх
Меню