Scala. Профессиональное программирование 2022. Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста
Скачать 6.24 Mb.
|
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 — объект. 598 Глоссарий Результирующий (в Scala), возвращаемый (в Java) тип (result type). Резуль тирующий/возвращаемый тип метода — тип значения, которое воз вращается в результате вызова этого метода. Рекурсия (recursive). Функция, которая вызывает саму себя, называется рекурсивной. Если этот вызов происходит только в последнем выра жении функции, то она является хвостовой рекурсией. Самостоятельный объект (standalone object). Объектодиночка без класса компаньона. Свободная переменная (free variable). Переменная называется свободной, если используется в выражении, но не объявлена внутри него. Например, в выражении функционального литерала (x: Int) => (x, y) использу ются обе переменные, x и y , но только y является свободной, так как не определена внутри этого выражения. Связанная переменная (bound variable). Переменная, которая определена и используется внутри выражения, является его связанной переменной. Например, в выражении функционального литерала (x: Int) => (x, y) используются две переменные, x и y , но только x является связанной, поскольку определена в выражении как Int и выступает единственным аргументом функции, описанной этим выражением. Селектор (selector). Значение, с которым сопоставляются образцы в выраже нии match . Например, в s match { case _ => } селектором выступает s Сериализация (serialization). Объект можно сериализовать в поток байтов, который затем может быть сохранен в файлы или передан по сети. Позже поток байтов можно будет десериализовать, даже находясь на другом компьютере, и получить объект, который идентичен сериали зованному оригиналу. Сигнатура (signature). Сокращенный вариант понятия «сигнатура типа». Сигнатура типа (type signature). Сигнатура типа метода определяет его имя, а также количество, порядок и типы его параметров (если тако вые имеются) и возвращаемый тип. Сигнатура типа класса, трейта или объектасинглтона определяет его имя, сигнатуры типов всех его членов и конструкторов, а также отношения наследования и приме шивания, которые в нем объявлены. Синтетический класс (synthetic class). Не пишется вручную программистом, а генерируется автоматически компилятором. Скрипт (script). Файл с высокоуровневыми определениями и выражениями, который можно запускать непосредственно с помощью команды scala , Глоссарий 599 без предварительной компиляции. Скрипт должен заканчиваться вы ражением, а не определением. Слабоструктурированные данные (semistructured data). Данные XML яв ляются слабоструктурированными. Они структурированы лучше, чем плоский двоичный или текстовый файл, но при этом уступают полно ценным структурам данных в языках программирования. Собственный тип (self type). Собственный тип трейта — это предполагаемый тип this , получателя, который будет использоваться внутри трейта. Любой конкретный класс, который примешивается в трейт, должен иметь тип, соответствующий собственному типу трейта. Чаще всего собственные типы используются для разбиения крупных классов на несколько трейтов (см. главу 7). Создание экземпляра (instantiate). Создать экземпляр класса означает создать на основе класса новый объект. Эта операция происходит только во время выполнения. Среда выполнения (runtime). Виртуальная машина Java (Java Virtual Machine, JVM), в которой выполняется программа на языке Scala. Среда вы- полнения включает в себя как виртуальную машину, соответствующую спецификации JVM, так и библиотеки Java API вместе со стандартны ми библиотеками Scala API. Словосочетание «во время выполнения» (run time) означает, что программа выполняется. Существует также время компиляции. Ссылаться (refers). Переменная в выполняемой программе на языке Scala всегда ссылается на какойто объект. Даже если этой переменной присвоить null , на концептуальном уровне она будет ссылаться на объект Null . Во время выполнения объект может быть реализован в виде объекта Java или значения примитивного типа, но Scala позво ляет программистам рассуждать о выполнении своего кода на более высоком уровне абстракции. См. также Ссылка. Ссылка (reference). Абстракция для указателя в Java, которая однозначно идентифицирует объект, размещенный в куче JVM. Переменные ссылочных типов хранят ссылки на объекты, поскольку ссылочные типы (экземпляры AnyRef ) реализованы в виде объектов Java, нахо дящихся в куче JVM. Для сравнения: переменные с типом значения могут хранить ссылку (на типобертку), а могут и нет (когда объект представлен примитивным значением). В целом переменные в Scala ссылаются на объекты. Термин «ссылаться» более абстрактный, чем «хранить ссылку». Если переменная типа scala.Int в настоящий момент представлена в виде примитивного значения int из Java, 600 Глоссарий то все равно ссылается на объект Int , хотя никаких ссылок при этом не используется. Ссылочная прозрачность (referential transparency). Свойство функций, которые не зависят от временного контекста и не имеют побочных эффектов. Если взять конкретные входные данные, то вызов ссылоч но прозрачной функции можно заменить ее результатом, не меняя семантику программы. Ссылочный тип (reference type). Подкласс AnyRef . Во время выполнения экземпляры ссылочных типов всегда находятся в куче JVM. Статический тип (static type). См. Тип. Суперкласс (superclass). Суперклассом класса являются его прямой супер класс, прямой суперкласс прямого суперкласса и так далее вплоть до Any Супертип (supertype). Тип является супертипом по отношению ко всем своим подтипам. Супертрейт (supertrait). Супертрейты класса или трейта (если таковые имеются) включают все трейты, напрямую примешанные в класс или трейт или любые его суперклассы, а также супертрейты этих трейтов. Тип (type). У всех переменных и выражений в программе на языке Scala есть тип, известный во время компиляции. Он ограничивает значения, на которые может ссылаться переменная и которые может возвращать выражение во время выполнения. Тип переменной или выражения можно также называть статическим типом, если необходимо под черкнуть его отличие от типа времени выполнения. Иными словами, понятие «тип» само по себе является статическим. Тип отличается от класса, поскольку параметризованный класс может формировать много разных типов. Например, List — это класс, а не тип. List[T] — тип со свободным параметром типа. List[Int] и List[String] — это тоже типы (их называют образующими типами, поскольку у них нет свободных параметров типов). У типа может быть класс или трейт. Например, классом типа List[Int] является List , а трейтом типа Set[String] — Set Тип времени выполнения (runtime type). Тип объекта во время выполнения. Для сравнения: статическим называют тип выражения во время компиляции. Большинство типов времени выполнения представляют собой типы классов без параметров типов. Например, тип времени выполнения "Hi" является строкой, а (x: Int) => x + 1 — Function1 Глоссарий 601 Для проверки типов времени выполнения можно использовать isIn- stanceOf Тип значения (value type). Любой подкласс AnyVal , такой как Int , Double или Unit . Этот термин имеет смысл на уровне исходного кода Scala. Во время выполнения экземпляры типов значений, соответствующие примитивным типам Java, могут быть реализованы в виде значе ний примитивных типов или экземпляров типовоберток, таких как java.lang.Integer . На протяжении существования экземпляра типа значения среда выполнения может превращать его из примитивного типа в типобертку и обратно (то есть упаковывать и распаковывать). Тип, зависящий от пути (pathdependent type). Тип наподобие swiss.cow.Food , где swiss.cow — это путь, составляющий ссылку на объект. Смысл типа зависит от пути, по которому вы к нему обращае тесь. Например, swiss.cow.Food и fish.Food — это разные типы. Трейт (trait). Определяется с помощью ключевого слова trait и представ ляет собой нечто похожее на абстрактный класс, который не может принимать никаких значений. Его можно «примешивать» в классы или другие трейты с помощью процедуры под названием «композиция примесей». Трейт, примешанный в класс или другой трейт, называют примесью. Трейт может быть параметризован с использованием одного или нескольких типов; в этом случае формируется новый тип. Напри мер, Set — трейт, который принимает один параметр типа, в то время как Set[Int] — это тип. Можно сказать, что Set является трейтом типа Set[Int] Уточняющий тип (refinement type). Тип, который формируется за счет присваивания значений членам базового типа внутри его фигурных скобок. Эти члены уточняют типы, присутствующие в базовом типе. Например, тип «животное, которое ест траву» можно выразить как Animal { type SuitableFood = Grass } Фильтр (filter). Инструкция if в выражении for , за которой идет булево выражение. В for(i <- 1 to 10; if i % 2 == 0) фильтром выступает if i % 2 == 0 . Значение справа от if — это выражение фильтра. Функциональное значение (function value). Функциональный объект, ко торый можно вызывать, как любую другую функцию. Класс функ ционального значения расширяет один из трейтов FunctionN (на пример, Function0 , Function1 ) из пакета scala и обычно выражается в исходном коде с помощью синтаксиса функциональных литералов. Функцио нальное значение вызывается, когда срабатывает его метод |