Файл: Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 733
Скачиваний: 11
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глоссарий 591
служит синонимом нонварианта: «класс
Array является инвариантным в своем параметре типа».
Инициализация (initialize). При определении переменной в исходном коде
Scala вы должны инициализировать ее с помощью какоголибо объекта.
Инструкция (statement). Выражение, определение или импорт, то есть дей
ствия, которые могут быть заданы в шаблоне или блоке исходного кода Scala.
Карринг (currying). Способ написания функций с несколькими списками параметров. Например, def f(x:
Int)(y:
Int)
— это каррированная функция с двумя списками параметров. Чтобы применить карриро
ванную функцию, ей нужно передать несколько списков аргументов, как в f(3)(4)
. Но мы можем также выполнить частичное применение каррированной функции, как в f(3)
Класс (class). Определяется с помощью ключевого слова class и может быть либо абстрактным, либо конкретным. Во время создания экземпляра класса его можно параметризовать с указанием типов и значений.
В выражении new
Array[String](2)
создается экземпляр класса
Array
, а тип получаемого значения —
Array[String]
. Класс, который прини
мает параметры типов, называется конструктором типа. У типа тоже может быть класс — например, классом типа
Array[String]
является
Array
Класс-компаньон (companion class). Класс с тем же именем, что и у объек
тасинглтона, определенного в том же исходном файле. Это класс
компаньон объектаодиночки.
Ковариантность (covariant). Аннотацию ковариантности можно приме
нить к параметру типа в классе или трейте, указав перед ним знак плюс (
+
). В результате класс или трейт формирует ковариантные вза
имоотношения с аннотированным параметром типа (направленные в ту же сторону). Например, если класс
List является ковариантным в своем первом параметре типа, то
List[String]
будет подтипом
List[Any]
Композиция примесей (mixin composition). Процесс примешивания трейтов в классы или другие трейты. От традиционного множественного на
следования композиция примесей отличается тем, что тип ссылки super неизвестен в момент определения трейта и определяется каждый раз, когда трейт примешивается в класс или в другой трейт.
Конструктор типа (type constructor). Класс или трейт, принимающий па
раметры типов.
592 Глоссарий
Контравариантность (contravariant). Аннотацию контравариантности можно применить к любому параметру типа в классе или трейте, указав перед ним знак минус (
-
). В результате класс или трейт фор
мирует контравариантные взаимоотношения с аннотированным па
раметром типа (направленные в противоположную от него сторону).
Например, если класс
Function1
является контравариантным в своем первом параметре типа, то
Function1[Any,
Any]
будет подтипом
Function1[String,
Any]
Литерал (literal).
1
,
"Один"
и
(x:
Int)
=>
x
+
1
— это все примеры литералов.
Это краткое описание объекта, которое в точности отражает структуру созданного объекта.
Локальная переменная (local variable). val или var
, определенные внутри блока. Параметры функции, несмотря на свою схожесть с локальными переменными, таковыми не считаются; их называют просто параме
трами или переменными.
Локальная функция (local function). Функция, определенная внутри блока.
Тогда как функция, определенная как член класса, трейта или объекта
одиночки, называется методом.
Метапрограммирование (metaprogramming). Вид программирования, в котором программы принимают на вход другие программы. Ком
пиляторы и инструменты наподобие scaladoc являются метапро
граммами. Средства метапрограммирования необходимы для работы с аннотациями.
Метод (method). Функция, которая является членом какогото класса, трей
та или объектаодиночки.
Метод без параметров (parameterless method). Это функция без параметров, которая является членом класса, трейта или объектаодиночки.
Множественные определения (multiple definitions). Одно и то же выражение может быть присвоено в нескольких определениях, если используется синтаксис вида val v1,
v2,
v3
=
exp
Модификатор (modifier). Ключевое слово, которое какимто образом огра
ничивает определение класса, трейта, поля или метода. Например, модификатор private говорит о том, что определяемый класс, трейт, поле или метод является приватным.
Недоступность (unreachable). На уровне Scala объекты могут становиться недоступными; в этом случае среда выполнения может освободить память, которую они занимают. Недоступность вовсе не означает от
Глоссарий 593
сутствие ссылок. Ссылочные типы (экземпляры
AnyRef
) реализуются в виде объектов, размещенных в куче JVM. Когда экземпляр ссылоч
ного типа становится недоступным, на него и в самом деле ничего не ссылается, что позволяет сборщику мусора его освободить. Типы значений (экземпляры
AnyVal
) реализуются как с помощью примитив
ных типов, так и в виде типовоберток (таких, как java.lang.In teger
), которые находятся в куче. Экземпляры типов значений могут упако
вываться (превращаться из примитивного значения в объектобертку) и распаковываться (превращаться из объектаобертки в примитивное значение) на протяжении существования переменной, которая на них ссылается. Если экземпляр типа значения, который в настоящий момент представлен объектомоберткой в куче JVM, становится не
доступным, то на него и в самом деле ничего не ссылается, что позво
ляет сборщику мусора его освободить. Но если в настоящий момент значение имеет примитивный тип и становится недоступным, то это не означает, что на него больше ничего не ссылается, поскольку он больше не существует в виде объекта в куче JVM. Среда выполнения может освободить память, занятую недоступными объектами. Но если тип
Int
, к примеру, реализован во время выполнения как примитивное значение int из языка Java и занимает какуюто память в стековом фрейме выполняющегося метода, то эта память освобождается, только когда фрейм достается из стека при завершении метода. Память для ссылочных типов, таких как
String
, может быть освобождена сборщи
ком мусора JVM после того, как они станут недоступными.
Неизменяемость (immutable). Объект является неизменяемым, если после того, как он был создан, его значение нельзя изменить никаким види
мым для клиентов образом. Объекты могут быть неизменяемыми, но не обязательно.
Нонвариант (nonvariant). Параметр типа класса или трейта по умолчанию является нонвариантом. Когда этот параметр меняется, класс или трейт не производит подтип. Например, класс
Array является нонвари
антом в своем параметре типа, поэтому
Array[String]
нельзя считать ни подтипом, ни супертипом
Array[Any]
Обобщенный класс (generic class). Класс, принимающий параметры типа. На
пример, класс scala.List принимает параметр типа, поэтому является обобщенным.
Обобщенный трейт (generic trait). Трейт, принимающий параметры типа.
Например, трейт scala.collection.Set принимает параметр типа, поэтому является обобщенным.
1 ... 56 57 58 59 60 61 62 63 64
594 Глоссарий
Образец (паттерн) (pattern). В выражении match
образца указывается после каждого ключевого слова case
, но перед ограждением образца (или символом
=>
).
Объект без ссылки (unreferenced). См. Недоступность.
Объект-компаньон (companion object). Объектодиночка с тем же именем, что и у класса, определенного в том же исходном файле. Объекты
компаньоны и классыкомпаньоны имеют доступ к приватным членам друг друга. Кроме того, любое неявное приведение типов, определен
ное в объектекомпаньоне, будет находиться в области видимости кода, в котором используется класс.
Объект-одиночка (singleton object). Объект, в определении которого ука
зано ключевое слово object
. У каждого объектаодиночки есть один и только один экземпляр. Если он находится в одном исходном фай
ле с одноименным классом, то его называют объектом-компаньоном данного класса. При этом класс является его классом-компаньоном.
Объектодиночка, у которого нет классакомпаньона, является само-
стоятельным объектом.
Объявление (declare). Вы можете объявить абстрактное поле, метод или тип, указав имя сущности, но не ее реализацию. Ключевое различие между объявлением и определением в том, что последнее, в отличие от перво
го, создает реализацию именованной сущности.
Ограждение образца (pattern guard). В выражении match за образцом может следовать его ограждение. Например, в case x
if x
%
2
==
0
=>
x
+
1
ограждением образца выступает if x
%
2
==
0
. Блок case с ограждением
образца выбирается только в случае соответствия образцу и если его ограждение возвращает true
Ограничение типа (type constraint). Некоторые аннотации выступают огра-
ничениями типа; это значит, что они накладывают дополнитель
ные ограничения на то, какие значения охватывает тип. Например,
@positive может ограничивать 32битный целочисленный тип
Int положительными значениями. Ограничения типов проверяются не стандартным компилятором Scala, а его подключаемым модулем или дополнительным инструментом.
Операция (operation). В Scala каждая операция представляет собой вызов метода. Методы могут вызываться с помощью синтаксиса оператора; например, в выражении b
+
2
знак
+
— это оператор.
Определение (define). В программе на языке Scala определение состоит из имени и реализации. Вы можете определять классы, трейты, объекты
Глоссарий 595
одиночки, поля, методы, локальные функции, локальные перемен
ные и т. д. Определение всегда подразумевает какуюто реализацию, поэтому абстрактные члены не определяются, а объявляются.
Параметр (parameter). Функции могут принимать любое количество па-
раметров (от нуля и больше). У каждого параметра есть имя и тип.
Если сравнивать аргументы и параметры, то первые ссылаются непо
средственно на объекты, которые передаются при вызове функции, а вторые являются переменными, которые ссылаются на эти пере
даваемые аргументы.
Параметр типа (type parameter). Параметр обобщенного класса или метода, в качестве которого должен быть указан тип. Например, класс
List определен как class
List[T]
{
, а метод identity объекта
Predef имеет определение def identity[T](x:T)
=
x
. В обоих случаях
T
— это параметр типа.
Параметр, передаваемый по значению (byvalue parameter). Параметр, перед типом которого не указано a
=>
, например
(x:
Int)
. Аргумент, относя
щийся к такому параметру, вычисляется перед вызовом метода. Это альтернатива передаче параметров по имени.
Параметр, передаваемый по имени (byname parameter). Параметр, перед типом которого указано a
=>
, например
(x:
=>
Int)
. Аргумент, отно
сящийся к такому параметру, вычисляется не перед вызовом метода, а каждый раз, когда в методе на него ссылаются по имени. Если пара
метр не передается по имени, то передается по значению.
Параметрическое поле (parametric field). Поле, определенное как параметр класса.
Первичный конструктор (primary constructor). Главный конструктор класса, который вызывает конструктор суперкласса, при необходимости ини
циализирует поля с использованием переданных значений и выпол
няет любой высокоуровневый код, определенный в фигурных скобках класса. Поля инициализируются только для тех параметров, которые не были переданы в суперконструктор; исключение составляют поля, которые не используются в теле класса и, следовательно, могут быть опущены.
Перекрытие (shadow). Новое определение локальной переменной перекры-
вает переменную с тем же именем, находящуюся в наружной области видимости.
Переменная (variable). Именованная сущность, которая ссылается на объект.
Переменная может быть определена как val или var
. В обоих случаях
596 Глоссарий при определении требуется инициализация, но только var позже мож
но будет назначить ссылку на другой объект.
Переназначаемость (reassignable). Переменная может быть переназначаемой.
Значения var переназначаемые, а val
— нет.
Подкласс (subclass). Класс является подклассом всех своих суперклассов и трейтов.
Подстановочный тип (wildcard type). Включает ссылки на неизвестные пере
менные типов. Например,
Array[_]
является подстановочным типом.
Это массив, о типе элементов которого ничего не известно.
Подтип (subtype). Компилятор Scala позволяет использовать вместо типа любые его подтипы. Если классы и трейты не принимают никаких параметров типов, то отношение подтипа является зеркальным от
ражением отношения подкласса. Например, если класс
Cat является подклассом абстрактного класса
Animal и ни один из них не при
нимает параметры типов, то тип
Cat будет подтипом
Animal
. Точно так же если трейт
Apple является подтрейтом трейта
Fruit и ни один из них не принимает параметры типов, то тип
Apple будет подтипом
Fruit
. Но если классы и трейты принимают параметры типов, то в силу вступает вариантность. Например, поскольку абстрактный класс
List является ковариантным в своем единственном параме
тре типа (то есть объявлен как
List[+A]
),
List[Cat]
будет подтипом
List[Animal]
, а
List[Apple]
— подтипом
List[Fruit]
. Эти отношения подтипов существуют, несмотря на то что классом каждого из этих типов выступает
List
. Для сравнения: поскольку класс
Set не явля
ется ковариантным в своем параметре типа (объявлен как
Set[A]
, без знака плюс),
Set[Cat]
не будет подтипом
Set[Animal]
. Подтип должен правильно реализовывать контракты своих супертипов с соблюдением принципа подстановки Лисков, но компилятор проверяет это только на уровне типа.
Подтрейт (subtrait). Трейт является подтрейтом всех своих супертрейтов.
Получатель (receiver). Получатель вызова метода — это переменная, выра
жение или объект, для которого вызывается метод.
Предикат (predicate). Функция, возвращающая тип
Boolean
Применение (apply). Вы можете применить метод, функцию или замыкание
к аргументам, то есть вызвать их для этих аргументов.
Примесь (mixin). Так называют трейт, который используется в композиции примесей. Иными словами,
Hat в trait
Hat является обычным трей
Глоссарий 597
том, а в new
Cat extends
AnyRef with
Hat его можно назвать примесью.
Этот термин можно использовать как глагол. Например, вы можете
примешать трейты в классы или другие трейты.
Принцип единообразного доступа (uniform access principle). Согласно этому принципу для доступа к переменным и функциям, у которых нет параметров, должен использоваться один и тот же синтаксис. Scala поддерживает данный принцип, не позволяя указывать скобки при вызове функций без параметров. Благодаря этому вместо определе
ния функции без параметров можно подставить val и наоборот, не затрагивая клиентский код.
Присваивание (assign). Вы можете присвоить объект переменной. После этого переменная будет ссылаться на данный объект.
Процедура (procedure). Функция, возвращающая тип
Unit
, которая выпол
няется исключительно для получения побочных эффектов.
Прямой подкласс (direct subclass). Класс, являющийся прямым наследником своего суперкласса.
Прямой суперкласс (direct superclass). Класс, непосредственной производ ной которого является другой класс или трейт, то есть ближайший класс, который находится сверху от него в иерархии наследования. Если класс
Parent указан в необязательной инструкции extends класса
Child
, то это значит, что
Parent является прямым суперклассом
Child
Если в инструкции extends класса
Child указан трейт, то данный трейт будет прямым суперклассом
Child
. Если у
Child нет инструкции extends
, его прямым родителем является
AnyRef
. Прямой суперкласс может принимать параметры типов — например, класс
Child может расширять
Parent[String]
; в этом случае прямым суперклассом
Child попрежнему будет
Parent
, а не
Parent[String]
. С другой стороны,
Parent[String]
будет прямым супертипом
Child
. Чтобы узнать больше о различиях между классами и типами, см. Супертип.
Равенство (equality). Отношение между значениями, выраженное как
==
(при отсутствии уточняющих параметров). См. также Равенство ссылок.
Равенство ссылок (reference equality). Означает, что две ссылки идентифи
цируют один и тот же объект Java. В случае со ссылочными типами равенство ссылок можно определить с помощью вызова eq в
AnyRef
(в Javaпрограммах для определения равенства ссылок можно исполь
зовать
==
, но тоже только для ссылочных типов).
Результат (result). Выражения в программах на языке Scala дают результат.
Результат любого выражения в Scala — объект.