Материал: Вопросы ИТ

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Строковые интерполяторы также могут принимать произвольные выражения. Например:

println(s"1 + 1 = ${1 + 1}")

Будет напечатана строка 1 + 1 = 2. Любое произвольное выражение может быть встроено в ${}.

Для некоторых специальных символов необходимо экранировать их, когда они встроены в строку. Чтобы представить реальный знак доллара, вы можете удвоить его $$, как здесь:

println(s"New offers starting at $$14.99")

Будет вывод строки New offers starting at $14.99.

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

val person = " " "{"name":"James"}" " "

Что приведет к появлению строки {"name":"James"} при печати.

Интерполятор “f”

Добавление “f” к любому строковому литералу позволяет создавать простые форматированные строки. При использовании интерполятора “f” все ссылки на переменные должны сопровождаться строкой формата в стиле printf, например %d. Давайте рассмотрим пример:

val height = 1.9d

val name = "James"

println(f"$name%s is $height%2.2f meters tall") // James is 1.90 meters tall

Интерполятор “raw”

Данный интерполятор аналогичен интерполятору “s”, за исключением того, что он не выполняет экранирование литералов в строке. Вот пример обработанной строки:

scala> s"a\nb"

res0: String =

a

b

Здесь интерполятор строк “s” заменил символы возвращаемым символом \n. Интерполятор “raw” этого не сделает.

scala> raw"a\nb"

res1: String = a\nb

Интерполятор “raw” полезен, когда вы хотите избежать использования выражений, таких как превращение \n в возвращаемый символ.

https://docs.scala-lang.org/overviews/core/string-interpolation.html

https://www.geeksforgeeks.org/scala-format-and-formatted-method/

22. Типы литералов в Scala.

Любое постоянное значение, которое может быть присвоено переменной, называется литералом / константой. Литералы представляют собой последовательность символов, используемых для описания постоянного значения в коде.

Типы литералов

  1. целочисленные

  2. с плавающей точкой

  3. булевы. Логические литералы допускают только два значения: истина и ложь , которые являются членами типа Boolean.

  4. строковые

  5. многострочные. Многострочные строковые литералы также являются сериями символов, но имеют несколько строк (в тройных ковычках)

  6. символьные. символьные литералы являются символами Uni-кода

23. Чем отличается List и Array?

Массив является изменяемым, что означает, что вы можете изменять значения каждого индекса, в то время как Список (по умолчанию) неизменяем, что означает, что каждый раз, когда вы вносите изменения, создается новый список.

Для характеристик производительности массив быстрее с произвольным доступом к элементам, в то время как Список быстрее при добавлении (добавлении) новых элементов.

24. Является ли язык Scala статически типизированным?

Язык обладает статической типизацией, если тип переменной известен во время компиляции, а не выполнения. Типичными примерами таких языков являются Ada, C, C++, C#, JADE, Java, Fortran, Haskell, ML, Pascal, и Scala.

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

25. Что такое статически типизированный язык и что такое динамически типизированный язык?

Статически типизированные языки

Статические языки проверяют типы в программе во время компиляции, еще до запуска программы. Любая программа, в которой типы нарушают правила языка, считается некорректной.

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

Одни статически типизированные языки требуют обозначать тип. Другие могут определить тип автоматически.

Не нужно запускать программу чтобы понять, что существует проблема.

Динамически типизированные языки

Динамически типизированные языки не требуют указывать тип, но и не определяют его сами. Типы переменных неизвестны до того момента, когда у них есть конкретные значения при запуске.

Говорят, что значения в динамических языках обладают типом, но переменные и функции — нет.

Сравнение

Большинство динамических языков выдадут ошибку, если типы используются некорректно. При использовании динамически типизированных языков даже простая ошибка вида "a" + 1 может возникнуть в боевом окружении. Статические языки предотвращают такие ошибки, но, конечно, степень предотвращения зависит от мощности системы типов.

Статические и динамические языки построены на фундаментально разных идеях о корректности программ. В динамическом языке "a" + 1 это корректная программа: код будет запущен и появится ошибка в среде исполнения. Однако, в большинстве статически типизированных языков выражение "a" + 1 — это не программа: она не будет скомпилирована и не будет запущена. Это некорректный код, так же, как набор случайных символов !&%^@*&%^@* — это некорректный код.

26. В чем разница между статически типизированными и динамически типизированными языками?

1. Большинство динамических языков выдадут ошибку, если типы используются некорректно.При использовании динамически типизированных языков даже простая ошибка вида "a" + 1. Статические языки предотвращают такие ошибки.

2. Статическая проверка: Все типы переменных должны быть явно указаны, так как эта информация требуется во время компиляции.

Например в Java: float f = 0.5;

Динамическая проверка: явное объявление не требуется, так как тип присваивается переменной во время выполнения.

Например в Python: f = 0.5

3. Статическая проверка: дополнительная обработка во время компиляции, но более высокая производительность во время выполнения.

Динамическая проверка: более эффективные компиляторы/интерпретаторы, но проверка типов во время выполнения влияет на производительность.

4. Статически типизированные языки ограничивают типы переменных: язык программирования может знать, например, что x — это Integer. В этом случае программисту запрещается делать x = true, это будет некорректный код.

Динамически типизированные языки помечают значения типами: язык знает, что 1 это integer, 2 это integer, но он не может знать, что переменная x всегда содержит integer. В этом случае мы можем делать х = true.

27. Является ли Scala чистым языком ООП? Является ли Java чистым языком ООП?

Scala является чистым объектно-ориентированным языком в том смысле, что все является объектом, включая числа или функции. В этом отношении он отличается от Java, поскольку Java различает примитивные типы (такие как boolean и int) и ссылочные типы.

28. Как и класс Java java.lang.Object, что является суперклассом всех классов в Scala?

Класс Any является корнем иерархии классов Scala. Каждый класс в среде выполнения Scala прямо или косвенно наследуется от этого класса.

Scala Standard Library 2.13.5 - scala.Any (scala-lang.org)

29. Что такое модификатор доступа по умолчанию в Scala? Есть ли у Scala ключевое слово public?

Модификатор доступа - ключевые слова, которые регулируют уровень доступа к разным частям кода. В Scala все поля классов по умолчанию имеют модификатор public.Объекты с данным модификатором доступа могут быть доступны из любой части программы.

Ссылка №1

Ссылка №2

30. Что такое REPL в Scala? Какая польза от Scala REPL? Как получить доступ к Scala REPL из командной

строки?

Scala REPL - это инструмент ( scala ) для оценки выражений в Scala.

Команда scala выполнит исходный сценарий, заключив его в шаблон, а затем скомпилировав и выполнив полученную программу.

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

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

К полезным функциям REPL относятся:

  • IMain REPL обязан $intp.

  • последнее исключение REPL связано с lastException.

  • используйте вкладку для завершения.

  • используйте, //print<tab>чтобы показать типизированные обессахаривания.

  • используйте :help для списка команд.

  • используйте :load для загрузки файла ввода REPL.

  • используйте :paste для ввода класса и объекта в качестве сопутствующих.

  • используйте, :paste -raw чтобы отключить перенос кода, чтобы определить пакет.

  • использовать :javap для проверки артефактов класса.

  • использовать -Yrepl-outdir для проверки артефактов класса с помощью внешних инструментов.

  • используйте :power для входа в режим мощности и импорта компонентов компилятора.

  • использовать :settings для изменения настроек компилятора; некоторые настройки требуют :replay.

  • используйте :replay для воспроизведения сеанса с измененными настройками.

Примечания по реализации:

  1. пользовательский код может быть заключен либо в объект (чтобы код запускался во время инициализации класса), либо в класс (чтобы код выполнялся во время создания экземпляра). Переключатель есть -Yrepl-class-based.

  2. каждая строка ввода компилируется отдельно.

  3. зависимости от предыдущих строк включаются автоматически сгенерированным импортом.

  4. неявным импортом scala.Predefможно управлять путем ввода явного импорта.

31. Как мы реализуем циклы функционально? В чем разница между циклами в стиле ООП и ФП?

Функционально циклы мы реализуем при помощи рекурсии.

В ООП вычисление описывается в виде инструкций, изменяющих состояние вычислителя, поэтому цикл в ООП выполняет группы инструкций при помощи инструкции while или for

А в функциональном программировании модель вычислений не использует понятие изменяемого состояния, поэтому в ФП нет циклов, поскольку нет различий между итерациями

32. Что такое «Application» в Scala или «Scala Application»? Что такое «App» в Scala? Какая польза от App?

Есть два способа создать точку запуска для вашего приложения:

  • Определить объект, расширяющий трейт App;

  • Определить объект с правильно определенным главным методом.

1) Расширение App

Для превращения объекта в исполняемую программу можно использовать трейт App.

object Hello extends App {

println("Hello, world")

}

Код в теле объекта выполняется автоматически, как если бы он находился внутри метода main.

2)Создание главного метода (main) внутри объекта

object Hello2 {

def main(args: Array[String]) {

println("Hello, world")

}

}

33. Поддерживает ли Scala перегрузку операторов?

в Scala нет перегрузки операторов, так как нет операторов (как сущностей отличных от методов). Есть методы с символическими (операторными) именами вида '+', '/', '::', '<~' и префиксная/инфиксная/посфиксная форма записи. (https://habr.com/ru/company/golovachcourses/blog/255631/)

34. В чем разница между «If..Else» в Java и «If..Else» в Scala?

if-else в Scala позволяет выбирать между двумя альтернативами. Синтаксис похож на if-else в Java. Но тогда как if-else в Java можно использовать только для альтернативных утверждений, Scala позволяет использовать тот же синтаксис для выбора между двумя выражениями. Поэтому в Scala if-else служит также для замены тернарного оператора Java (… ? … : ….)

35. В чем разница между функцией и методом в Scala?

Конкретные различия сводятся к следующему

1. Методы не могут существовать как отдельные выражения (кроме методов с пустыми параметрами), в то время как функции могут.

2. Функция должна иметь список параметров, а метод не может иметь список параметров

3. Имя метода является вызовом метода, а имя функции представляет только сам объект функции

4. Параметр передачи по сути является методом

Функция – это блок кода, который выполняет определённую задачу. Обычно, бизнес проблема разбивается на отдельные задачи, для решения которых, создаются функции.

Метод, в Scala, это часть класса, а функция – это отдельный объект, который может быть присвоен какой-то переменной. Т.е. метод – это функция, которая объявлена элементом класса.

36. Сколько классов можно определить в исходном файле Scala? Java?

В файле scala можно объявить любое количество как обычных классов, так и вложенных , а в java можно объявить только один главный класс и множество вложенных

37. Укажите некоторые ключевые слова, которые используются Java и не требуются в Scala? Почему Scala не требует их?

Ну, например слово return в java. Оно используется для возвращения значения из метода. А в scala, не требуется писать return,чтобы вернуть нужное значение, потому что последнее выражение в теле автоматически становится возвращаемым значением метода.

Также в java есть слово void. Его не используют в scala, потому что в scala все является выражением , что означает, что все возвращает значение. Это одна из причин, почему Scala имеется тип Unit вместо типа void - потому что даже вещи, которые были бы void в Java, должны возвращать значение в Scala.

38. Что такое побочный эффект?

По сути, побочный эффект — любое действие, которое наблюдается за пределами функции или выражения помимо возврата значения, например:

  • операция ввода-вывода,

  • модификация переменной (доступной за пределами области видимости),

  • изменение состояния объекта (наблюдаемое вне области видимости),

  • возбуждение исключения (которое также не обрабатывается внутри области видимости).

О функциях или выражениях, содержащих любое из вышеперечисленных действий, говорят, что они имеют побочные эффекты, в противном случае их называют «чистыми».

Почему побочные эффекты так важны? Потому что с ними порядок исполнения имеет значение. Например, два «чистых» выражения, (связанных с соответствующими значениями):

val x = 1 + 2

val y = 2 + 3

Так как они не содержат побочных эффектов (т.е. эффектов, наблюдаемых вне выражений), мы можем вычислить эти выражения в произвольном порядке — сначала x, а затем y или сначала y, а затем x — это не повлияет на корректность полученных результатов (мы можем даже закешировать результирующие значения, если того захотим). Теперь рассмотрим следующую модификацию:

Источник: https://studfile.net/preview/16556764/