Файл: Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 724
Скачиваний: 11
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глава 11. Трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 11 .1 . Как работают трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 11 .2 . Сравнение «тонких» и «толстых» интерфейсов . . . . . . . . . . . . . . . 232 11 .3 . Трейты как наращиваемые модификации . . . . . . . . . . . . . . . . . . . . 235 11 .4 . Почему не используется множественное наследование . . . . . . . . . 239 11 .5 . Параметры трейтов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Глава 12. Пакеты, импорты и экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .1 . Помещение кода в пакеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .2 . Краткая форма доступа к родственному коду . . . . . . . . . . . . . . . . . 249 12 .3 . Импортирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 12 .4 . Неявное импортирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 12 .5 . Модификаторы доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Приватные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Защищенные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Публичные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Область защиты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Видимость и объекты-компаньоны . . . . . . . . . . . . . . . . . . . . . . . 260 12 .6 . Определения верхнего уровня . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 12 .7 . Экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Глава 13. Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 13 .1 . Простой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
case-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Сравнение match со switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12 Оглавление
13 .2 . Разновидности паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Подстановочные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Паттерны-константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Патерны-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Паттерны-конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Паттерны-последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Паттерны-кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Типизированные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Затирание типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Привязка переменной . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .3 . Ограждение образца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .4 . Наложение паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 13 .5 . Запечатанные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 13 .6 . Сопоставление паттерна Options . . . . . . . . . . . . . . . . . . . . . . . . . . 285 13 .7 . Паттерны повсюду . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Паттерны в определениях переменных . . . . . . . . . . . . . . . . . . . 286
Последовательности вариантов в качестве частично примененных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Паттерны в выражениях for . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 13 .8 . Большой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Глава 14. Работа со списками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .1 . Литералы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .2 . Тип List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .3 . Создание списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .4 . Основные операции над списками . . . . . . . . . . . . . . . . . . . . . . . . . 301 14 .5 . Паттерны-списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 14 .6 . Методы первого порядка класса List . . . . . . . . . . . . . . . . . . . . . . . . 304
Конкатенация двух списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Принцип «разделяй и властвуй» . . . . . . . . . . . . . . . . . . . . . . . . 305
Получение длины списка: length . . . . . . . . . . . . . . . . . . . . . . . . 307
Обращение к концу списка: init и last . . . . . . . . . . . . . . . . . . . . . 307
Реверсирование списков: reverse . . . . . . . . . . . . . . . . . . . . . . . . 308
Префиксы и суффиксы: drop, take и splitAt . . . . . . . . . . . . . . . . . 309
Выбор элемента: apply и indices . . . . . . . . . . . . . . . . . . . . . . . . . 310
Линеаризация списка списков: flatten . . . . . . . . . . . . . . . . . . . . . 310
Объединение списков: zip и unzip . . . . . . . . . . . . . . . . . . . . . . . . 311
Отображение списков: toString и mkString . . . . . . . . . . . . . . . . . 311
Оглавление 13
Преобразование списков: iterator, toArray, copyToArray . . . . . . . . 312
Пример: сортировка слиянием . . . . . . . . . . . . . . . . . . . . . . . . . . 313 14 .7 . Методы высшего порядка класса List . . . . . . . . . . . . . . . . . . . . . . . 315
Отображения списков: map, flatMap и foreach . . . . . . . . . . . . . . . 316
Фильтрация списков: filter, partition, find, takeWhile, dropWhile и span . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Применение предикатов к спискам: forall и exists . . . . . . . . . . . . 318
Свертка списков: foldLeft и foldRight . . . . . . . . . . . . . . . . . . . . . . 319
Пример: реверсирование списков с помощью свертки . . . . . . . . 321
Сортировка списков: sortWith . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 14 .8 . Методы объекта List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Создание списков из их элементов: List .apply . . . . . . . . . . . . . . . 323
Создание диапазона чисел: List .range . . . . . . . . . . . . . . . . . . . . . 323
Создание единообразных списков: List .fill . . . . . . . . . . . . . . . . . . 324
Табулирование функции: List .tabulate . . . . . . . . . . . . . . . . . . . . 324
Конкатенация нескольких списков: List .concat . . . . . . . . . . . . . . 324 14 .9 . Совместная обработка нескольких списков . . . . . . . . . . . . . . . . . . 325 14 .10 . Понимание имеющегося в Scala алгоритма вывода типов . . . . . . . 326
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Глава 15. Работа с другими коллекциями . . . . . . . . . . . . . . . . . . . . . . . . . 331 15 .1 . Последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Строки (реализуемые через StringOps) . . . . . . . . . . . . . . . . . . . . 334 15 .2 . Множества и отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Использование множеств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Применение отображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Множества и отображения, используемые по умолчанию . . . . . . 340
Отсортированные множества и отображения . . . . . . . . . . . . . . . 341 15 .3 . Выбор между изменяемыми или неизменяемыми коллекциями . . . . 342 15 .4 . Инициализация коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Преобразование в массив или список . . . . . . . . . . . . . . . . . . . . . 346
Преобразования между изменяемыми и неизменяемыми множествами и отображениями . . . . . . . . . . . . . . . . . . . . . . . . . 347 15 .5 . Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
14 Оглавление
Глава 16. Изменяемые объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .1 . Что делает объект изменяемым . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .2 . Переназначаемые переменные и свойства . . . . . . . . . . . . . . . . . . . 352 16 .3 . Практический пример: моделирование дискретных событий . . . . . . 356 16 .4 . Язык для цифровых схем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 16 .5 . API моделирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 16 .6 . Моделирование электронной логической схемы . . . . . . . . . . . . . . . 364
Класс Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Метод inverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Методы andGate и orGate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Вывод симуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Запуск симулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Глава 17. Иерархия Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .1 . Иерархия классов Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .2 . Как реализованы примитивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 17 .3 . Низшие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 17 .4 . Определение собственных классов значений . . . . . . . . . . . . . . . . . 379
Уход от монокультурности типов . . . . . . . . . . . . . . . . . . . . . . . . 380 17 .5 . Типы пересечений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 17 .6 . Типы объединения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 17 .7 . Прозрачные трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Глава 18. Параметризация типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .1 . Функциональные очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .2 . Сокрытие информации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Приватные конструкторы и фабричные методы . . . . . . . . . . . . . 392
Альтернативный вариант: приватные классы . . . . . . . . . . . . . . . 393 18 .3 . Аннотации вариантности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Вариантность и массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 18 .4 . Проверка аннотаций вариантности . . . . . . . . . . . . . . . . . . . . . . . . 399 18 .5 . Нижние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 18 .6 . Контравариантность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 18 .7 . Верхние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Оглавление 15
Глава 19. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .1 . Перечисляемые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .2 . Алгебраические типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 19 .3 . Обобщенные ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 19 .4 . Что делает типы ADT алгебраическими . . . . . . . . . . . . . . . . . . . . . 417
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Глава 20. Абстрактные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .1 . Краткий обзор абстрактных членов . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .2 . Члены-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 20 .3 . Абстрактные val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 20 .4 . Абстрактные var-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 20 .5 . Инициализация абстрактных val-переменных . . . . . . . . . . . . . . . . . 425
Параметрические поля трейтов . . . . . . . . . . . . . . . . . . . . . . . . . 427
Ленивые val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 20 .6 . Абстрактные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 20 .7 . Типы, зависящие от пути . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 20 .8 . Уточняющие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 20 .9 . Практический пример: работа с валютой . . . . . . . . . . . . . . . . . . . . 437
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Глава 21. Гивены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 21 .1 . Как это работает . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 21 .2 . Параметризованные given-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 21 .3 . Анонимные given-экземпляры . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 21 .4 . Параметризованные given-экземпляры в виде классов типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 21 .5 . Импорт гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 21 .6 . Правила для контекстных параметров . . . . . . . . . . . . . . . . . . . . . . 461 21 .7 . Когда подходит сразу несколько гивенов . . . . . . . . . . . . . . . . . . . . 463 21 .8 . Отладка гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Глава 22. Методы расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .1 . Основы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .2 . Обобщенные расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 22 .3 . Групповые расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 22 .4 . Использование класса типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
16 Оглавление
22 .5 . Методы расширения для заданных экземпляров . . . . . . . . . . . . . . . 477 22 .6 . Где Scala ищет методы расширения . . . . . . . . . . . . . . . . . . . . . . . . 480
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Глава 23. Классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .1 . Зачем нужны классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .2 . Границы контекста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 23 .3 . Главные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 23 .4 . Многостороннее равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494 23 .5 . Неявные преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 23 .6 . Пример использования класса типов: сериализация JSON . . . . . . . 502
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Глава 24. Углубленное изучение коллекций . . . . . . . . . . . . . . . . . . . . . . . . 511 24 .1 . Изменяемые и неизменяемые коллекции . . . . . . . . . . . . . . . . . . . . 513 24 .2 . Согласованность коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 24 .3 . Трейт Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Подкатегории Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 24 .4 . Трейты последовательностей Seq, IndexedSeq и LinearSeq . . . . . . . 523
Буферы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 24 .5 . Множества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 24 .6 . Отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 24 .7 . Конкретные классы неизменяемых коллекций . . . . . . . . . . . . . . . . 538
Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Ленивые списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Неизменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Векторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Неизменяемые очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Диапазоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Сжатые коллекции HAMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Красно-черные деревья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Неизменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . 544
Векторные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Списочные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 24 .8 . Конкретные классы изменяемых коллекций . . . . . . . . . . . . . . . . . . 546
Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Построители строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Оглавление 17
ArrayDeque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Стеки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Изменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Хеш-таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Слабые хеш-отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Совместно используемые отображения . . . . . . . . . . . . . . . . . . . 550
Изменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . . . 550 24 .9 . Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 24 .10 . Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 24 .11 . Характеристики производительности . . . . . . . . . . . . . . . . . . . . . . 556 24 .12 . Равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 24 .13 . Представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 24 .14 . Итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Буферизованные итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 24 .15 . Создание коллекций с нуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 24 .16 . Преобразования между коллекциями Java и Scala . . . . . . . . . . . . . 573
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Глава 25. Утверждения и тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 25 .1 . Утверждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 25 .2 . Тестирование в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 25 .3 . Информативные отчеты об ошибках . . . . . . . . . . . . . . . . . . . . . . . 579 25 .4 . Использование тестов в качестве спецификаций . . . . . . . . . . . . . . 581 25 .5 . Тестирование на основе свойств . . . . . . . . . . . . . . . . . . . . . . . . . . 584 25 .6 . Подготовка и проведение тестов . . . . . . . . . . . . . . . . . . . . . . . . . . 586
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Отзывы на предыдущие издания книги
Это, вероятно, одна из лучших книг по программированию, которые я ко
гдалибо читал. Мне нравятся стиль изложения, краткость и подробные объяснения. Книга, кажется, отвечает на каждый вопрос, который приходит мне в голову, — она всегда на шаг впереди меня. Авторы не просто дают вам код — они объясняют самую суть, чтобы вы действительно понимали, о чем идет речь. Мне это очень нравится.
Кен Эджервари (Ken Egervari),
ведущий разработчик программного обеспечения
Эта книга написана четко, основательно и понятно. В ней есть отличные примеры и полезные советы. Она позволила нашей организации быстро и эффективно освоить язык Scala. Эта книга отлично подходит для любого программиста, который хочет разобраться в гибкости и элегантности этого языка.
Ларри Моррони (Larry Morroni),
владелец Morroni Technologies, Inc.
Это отличный учебник по языку Scala. В нем хорошо проработана каждая глава, основанная на концепциях и примерах, описанных в предыдущих главах. Подробно объясняются конструкции языка, часто приводятся при
меры того, чем язык отличается от Java. Помимо основного языка, также рассматриваются такие библиотеки, как контейнеры и акторы.
С этим пособием действительно легко работать, и, вероятно, это одна из луч
ших технических книг, которые я читал за последнее время. Я настоятельно рекомендую эту книгу любому программисту, желающему узнать больше о языке Scala.
Мэтью Тодд (Matthew Todd)
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Глава 12. Пакеты, импорты и экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .1 . Помещение кода в пакеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .2 . Краткая форма доступа к родственному коду . . . . . . . . . . . . . . . . . 249 12 .3 . Импортирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 12 .4 . Неявное импортирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 12 .5 . Модификаторы доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Приватные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Защищенные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Публичные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Область защиты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Видимость и объекты-компаньоны . . . . . . . . . . . . . . . . . . . . . . . 260 12 .6 . Определения верхнего уровня . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 12 .7 . Экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Глава 13. Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 13 .1 . Простой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
case-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Сравнение match со switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12 Оглавление
13 .2 . Разновидности паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Подстановочные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Паттерны-константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Патерны-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Паттерны-конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Паттерны-последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Паттерны-кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Типизированные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Затирание типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Привязка переменной . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .3 . Ограждение образца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .4 . Наложение паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 13 .5 . Запечатанные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 13 .6 . Сопоставление паттерна Options . . . . . . . . . . . . . . . . . . . . . . . . . . 285 13 .7 . Паттерны повсюду . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Паттерны в определениях переменных . . . . . . . . . . . . . . . . . . . 286
Последовательности вариантов в качестве частично примененных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Паттерны в выражениях for . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 13 .8 . Большой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Глава 14. Работа со списками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .1 . Литералы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .2 . Тип List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .3 . Создание списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .4 . Основные операции над списками . . . . . . . . . . . . . . . . . . . . . . . . . 301 14 .5 . Паттерны-списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 14 .6 . Методы первого порядка класса List . . . . . . . . . . . . . . . . . . . . . . . . 304
Конкатенация двух списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Принцип «разделяй и властвуй» . . . . . . . . . . . . . . . . . . . . . . . . 305
Получение длины списка: length . . . . . . . . . . . . . . . . . . . . . . . . 307
Обращение к концу списка: init и last . . . . . . . . . . . . . . . . . . . . . 307
Реверсирование списков: reverse . . . . . . . . . . . . . . . . . . . . . . . . 308
Префиксы и суффиксы: drop, take и splitAt . . . . . . . . . . . . . . . . . 309
Выбор элемента: apply и indices . . . . . . . . . . . . . . . . . . . . . . . . . 310
Линеаризация списка списков: flatten . . . . . . . . . . . . . . . . . . . . . 310
Объединение списков: zip и unzip . . . . . . . . . . . . . . . . . . . . . . . . 311
Отображение списков: toString и mkString . . . . . . . . . . . . . . . . . 311
Оглавление 13
Преобразование списков: iterator, toArray, copyToArray . . . . . . . . 312
Пример: сортировка слиянием . . . . . . . . . . . . . . . . . . . . . . . . . . 313 14 .7 . Методы высшего порядка класса List . . . . . . . . . . . . . . . . . . . . . . . 315
Отображения списков: map, flatMap и foreach . . . . . . . . . . . . . . . 316
Фильтрация списков: filter, partition, find, takeWhile, dropWhile и span . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Применение предикатов к спискам: forall и exists . . . . . . . . . . . . 318
Свертка списков: foldLeft и foldRight . . . . . . . . . . . . . . . . . . . . . . 319
Пример: реверсирование списков с помощью свертки . . . . . . . . 321
Сортировка списков: sortWith . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 14 .8 . Методы объекта List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Создание списков из их элементов: List .apply . . . . . . . . . . . . . . . 323
Создание диапазона чисел: List .range . . . . . . . . . . . . . . . . . . . . . 323
Создание единообразных списков: List .fill . . . . . . . . . . . . . . . . . . 324
Табулирование функции: List .tabulate . . . . . . . . . . . . . . . . . . . . 324
Конкатенация нескольких списков: List .concat . . . . . . . . . . . . . . 324 14 .9 . Совместная обработка нескольких списков . . . . . . . . . . . . . . . . . . 325 14 .10 . Понимание имеющегося в Scala алгоритма вывода типов . . . . . . . 326
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Глава 15. Работа с другими коллекциями . . . . . . . . . . . . . . . . . . . . . . . . . 331 15 .1 . Последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Строки (реализуемые через StringOps) . . . . . . . . . . . . . . . . . . . . 334 15 .2 . Множества и отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Использование множеств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Применение отображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Множества и отображения, используемые по умолчанию . . . . . . 340
Отсортированные множества и отображения . . . . . . . . . . . . . . . 341 15 .3 . Выбор между изменяемыми или неизменяемыми коллекциями . . . . 342 15 .4 . Инициализация коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Преобразование в массив или список . . . . . . . . . . . . . . . . . . . . . 346
Преобразования между изменяемыми и неизменяемыми множествами и отображениями . . . . . . . . . . . . . . . . . . . . . . . . . 347 15 .5 . Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
14 Оглавление
Глава 16. Изменяемые объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .1 . Что делает объект изменяемым . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .2 . Переназначаемые переменные и свойства . . . . . . . . . . . . . . . . . . . 352 16 .3 . Практический пример: моделирование дискретных событий . . . . . . 356 16 .4 . Язык для цифровых схем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 16 .5 . API моделирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 16 .6 . Моделирование электронной логической схемы . . . . . . . . . . . . . . . 364
Класс Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Метод inverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Методы andGate и orGate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Вывод симуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Запуск симулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Глава 17. Иерархия Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .1 . Иерархия классов Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .2 . Как реализованы примитивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 17 .3 . Низшие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 17 .4 . Определение собственных классов значений . . . . . . . . . . . . . . . . . 379
Уход от монокультурности типов . . . . . . . . . . . . . . . . . . . . . . . . 380 17 .5 . Типы пересечений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 17 .6 . Типы объединения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 17 .7 . Прозрачные трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Глава 18. Параметризация типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .1 . Функциональные очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .2 . Сокрытие информации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Приватные конструкторы и фабричные методы . . . . . . . . . . . . . 392
Альтернативный вариант: приватные классы . . . . . . . . . . . . . . . 393 18 .3 . Аннотации вариантности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Вариантность и массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 18 .4 . Проверка аннотаций вариантности . . . . . . . . . . . . . . . . . . . . . . . . 399 18 .5 . Нижние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 18 .6 . Контравариантность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 18 .7 . Верхние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Оглавление 15
Глава 19. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .1 . Перечисляемые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .2 . Алгебраические типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 19 .3 . Обобщенные ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 19 .4 . Что делает типы ADT алгебраическими . . . . . . . . . . . . . . . . . . . . . 417
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Глава 20. Абстрактные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .1 . Краткий обзор абстрактных членов . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .2 . Члены-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 20 .3 . Абстрактные val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 20 .4 . Абстрактные var-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 20 .5 . Инициализация абстрактных val-переменных . . . . . . . . . . . . . . . . . 425
Параметрические поля трейтов . . . . . . . . . . . . . . . . . . . . . . . . . 427
Ленивые val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 20 .6 . Абстрактные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 20 .7 . Типы, зависящие от пути . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 20 .8 . Уточняющие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 20 .9 . Практический пример: работа с валютой . . . . . . . . . . . . . . . . . . . . 437
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Глава 21. Гивены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 21 .1 . Как это работает . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 21 .2 . Параметризованные given-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 21 .3 . Анонимные given-экземпляры . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 21 .4 . Параметризованные given-экземпляры в виде классов типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 21 .5 . Импорт гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 21 .6 . Правила для контекстных параметров . . . . . . . . . . . . . . . . . . . . . . 461 21 .7 . Когда подходит сразу несколько гивенов . . . . . . . . . . . . . . . . . . . . 463 21 .8 . Отладка гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Глава 22. Методы расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .1 . Основы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .2 . Обобщенные расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 22 .3 . Групповые расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 22 .4 . Использование класса типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
16 Оглавление
22 .5 . Методы расширения для заданных экземпляров . . . . . . . . . . . . . . . 477 22 .6 . Где Scala ищет методы расширения . . . . . . . . . . . . . . . . . . . . . . . . 480
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Глава 23. Классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .1 . Зачем нужны классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .2 . Границы контекста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 23 .3 . Главные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 23 .4 . Многостороннее равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494 23 .5 . Неявные преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 23 .6 . Пример использования класса типов: сериализация JSON . . . . . . . 502
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Глава 24. Углубленное изучение коллекций . . . . . . . . . . . . . . . . . . . . . . . . 511 24 .1 . Изменяемые и неизменяемые коллекции . . . . . . . . . . . . . . . . . . . . 513 24 .2 . Согласованность коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 24 .3 . Трейт Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Подкатегории Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 24 .4 . Трейты последовательностей Seq, IndexedSeq и LinearSeq . . . . . . . 523
Буферы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 24 .5 . Множества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 24 .6 . Отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 24 .7 . Конкретные классы неизменяемых коллекций . . . . . . . . . . . . . . . . 538
Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Ленивые списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Неизменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Векторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Неизменяемые очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Диапазоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Сжатые коллекции HAMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Красно-черные деревья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Неизменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . 544
Векторные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Списочные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 24 .8 . Конкретные классы изменяемых коллекций . . . . . . . . . . . . . . . . . . 546
Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Построители строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Оглавление 17
ArrayDeque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Стеки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Изменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Хеш-таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Слабые хеш-отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Совместно используемые отображения . . . . . . . . . . . . . . . . . . . 550
Изменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . . . 550 24 .9 . Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 24 .10 . Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 24 .11 . Характеристики производительности . . . . . . . . . . . . . . . . . . . . . . 556 24 .12 . Равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 24 .13 . Представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 24 .14 . Итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Буферизованные итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 24 .15 . Создание коллекций с нуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 24 .16 . Преобразования между коллекциями Java и Scala . . . . . . . . . . . . . 573
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
1 2 3 4 5 6 7 8 9 ... 64
Глава 25. Утверждения и тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 25 .1 . Утверждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 25 .2 . Тестирование в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 25 .3 . Информативные отчеты об ошибках . . . . . . . . . . . . . . . . . . . . . . . 579 25 .4 . Использование тестов в качестве спецификаций . . . . . . . . . . . . . . 581 25 .5 . Тестирование на основе свойств . . . . . . . . . . . . . . . . . . . . . . . . . . 584 25 .6 . Подготовка и проведение тестов . . . . . . . . . . . . . . . . . . . . . . . . . . 586
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Отзывы на предыдущие издания книги
Это, вероятно, одна из лучших книг по программированию, которые я ко
гдалибо читал. Мне нравятся стиль изложения, краткость и подробные объяснения. Книга, кажется, отвечает на каждый вопрос, который приходит мне в голову, — она всегда на шаг впереди меня. Авторы не просто дают вам код — они объясняют самую суть, чтобы вы действительно понимали, о чем идет речь. Мне это очень нравится.
Кен Эджервари (Ken Egervari),
ведущий разработчик программного обеспечения
Эта книга написана четко, основательно и понятно. В ней есть отличные примеры и полезные советы. Она позволила нашей организации быстро и эффективно освоить язык Scala. Эта книга отлично подходит для любого программиста, который хочет разобраться в гибкости и элегантности этого языка.
Ларри Моррони (Larry Morroni),
владелец Morroni Technologies, Inc.
Это отличный учебник по языку Scala. В нем хорошо проработана каждая глава, основанная на концепциях и примерах, описанных в предыдущих главах. Подробно объясняются конструкции языка, часто приводятся при
меры того, чем язык отличается от Java. Помимо основного языка, также рассматриваются такие библиотеки, как контейнеры и акторы.
С этим пособием действительно легко работать, и, вероятно, это одна из луч
ших технических книг, которые я читал за последнее время. Я настоятельно рекомендую эту книгу любому программисту, желающему узнать больше о языке Scala.
Мэтью Тодд (Matthew Todd)