Проблема, которую решают Generics
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 57 из 73.
Представьте, что вам нужна функция, которая просто возвращает любое переданное ей значение: тождественная функция. С известными вам на данный момент типами у вас есть два варианта, и оба неудобны.
Вариант первый: написать отдельную копию для каждого типа. Тела функций идентичны; различаются только аннотации:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endКаждый новый тип означает ещё одну копию, а ошибку, исправленную в одной копии, нужно исправлять во всех остальных. Именно такого дублирования вы и стараетесь избегать, когда пишете функции.
Вариант второй: объединить их в одну функцию с типом any:
local function echo(value: any): any
return value
endТеперь одна функция обрабатывает всё, но платой за это становится безопасность типов. Когда вы вызываете echo("hello"), checker больше не знает, что результат является строкой. Он знает только any, поэтому автодополнение перестаёт работать, а ошибки типов проходят незамеченными: связь между тем, что поступило на вход, и тем, что получилось на выходе, теряется.
На самом деле вам нужна функция, которая работает с любым типом и запоминает, какой тип использовался в каждом вызове. Именно это дают вам обобщённые типы, и им посвящена эта глава.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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