Обобщенные массивы
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 60 из 73.
Дженерики становятся действительно полезными, когда дело доходит до таблиц. Вы уже записываете типизированные массивы как {number} или {string} — внутри обобщенной функции тип элемента может быть просто T, а {T} означает "массив из того, чем окажется T".
Вот классический пример — получение первого элемента любого массива:
local function first<T>(items: {T}): T?
return items[1]
endПередайте {string}, и проверка выведет T = string, поэтому результатом будет строка. Передайте {number}, и это будет число. Одна функция заменяет целое семейство копий для каждого типа.
Посмотрите внимательно на возвращаемый тип: это T?, а не T. Массив может быть пустым, и тогда items[1] будет nil — опциональный тип, с которым вы познакомились ранее, честно говорит об этом: "T или nil". Проверка подтолкнет вызывающий код к обработке случая nil перед использованием результата, а это именно то выявление ошибок, которое требуется от типизированного языка.
Задание
ЛегкоСоздайте обобщенную функцию (generic function) с именем 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Обобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функции