Проблема, которую решают 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 больше не знает, что result — это string. Он знает только any, поэтому автодополнение отключается, а ошибки типов проскакивают: связь между тем, что попало на вход, и тем, что получается на выходе, теряется.
Что вам действительно нужно — это функция, которая работает для каждого типа и запоминает, какой тип использовался при каждом вызове. Это именно то, что дают вам обобщенные типы (generics) — и они являются темой этой главы.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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Обобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функции