Обобщенные массивы
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 60 из 73.
Обобщения становятся действительно полезными, когда в дело вступают таблицы. Вы уже записываете типизированные массивы как {number} или {string}. Внутри обобщённой function тип element может быть просто T, а {T} означает «массив любого типа, которым в итоге окажется T».
Вот классический пример: получение first element любого массива:
local function first<T>(items: {T}): T?
return items[1]
endПередайте {string}, и проверяющий выводит, что T = string, поэтому результатом будет строка. Передайте {number}, и результатом будет число. Одна function заменяет целое семейство копий для каждого типа.
Внимательно посмотрите на тип возвращаемого значения: это T?, а не T. Массив может быть пустым, и тогда items[1] равен nil: тип optional, с которым вы познакомились ранее, честно сообщает: «T или nil». Проверяющий подтолкнёт вызывающий код обработать случай nil перед использованием результата — именно такое выявление ошибок и нужно от типизированного языка.
Задание
ЛегкоСоздайте обобщённую функцию с именем first, которая:
- объявляет параметр типа
T - принимает один параметр с именем
itemsтипа{T} - возвращает первый элемент с возвращаемым типом
T?(для пустого массива этоnil)
Создайте следующие типизированные массивы:
fruitsтипа{string}со значениями"apple","banana","cherry"scoresтипа{number}со значениями10,20,30,40flagsтипа{boolean}со значениямиfalse,trueemptyтипа{string}без элементов
Выведите результат вызова first для каждого массива в этом порядке, каждый результат — на отдельной строке.
Попробуйте сами
-- Напишите код здесь
-- 1) определите first<T>(items: {T}): T? возвращающую items[1]
-- 2) создайте fruits: {string}, scores: {number}, flags: {boolean},
-- и пустой массив {string}
-- 3) выведите first(...) каждого массива в этом порядке
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблиц9Обобщения (Generics): первое знакомство
Проблема, которую решают GenericsОбобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функцииПотренируйтесь самостоятельно: Онлайн-компилятор Lua