Использование обобщенной функции
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 59 из 73.
Вы никогда не указываете identity, чем является T — проверятель типов определяет это самостоятельно. Это и есть вывод типов (type inference): при каждом вызове Luau смотрит на аргумент и находит значение для T:
local word = identity("Luau") -- T выведен как string
local count = identity(12) -- T выведен как number
local flag = identity(false) -- T выведен как booleanКаждый вызов независим — T может быть string в одной строке и number в следующей. Выведенный результат настолько же безопасен, как и написанный вручную тип: word является string для проверятеля типов, с полным автодополнением и проверкой ошибок.
Одно важное отличие от TypeScript: TS позволяет принудительно задать тип в месте вызова с помощью identity<number>(5). В Luau нет аргументов типа в месте вызова — эта строка не является специальным синтаксисом, поэтому Luau считывает угловые скобки как операции сравнения «меньше/больше», и код завершается ошибкой. Если вы хотите явно указать тип, аннотируйте переменную:
local count: number = identity(12)Вы можете увидеть вывод типов в действии с помощью знакомого инструмента: typeof возвращает имя типа значения во время выполнения, поэтому print(typeof(identity(12))) выводит number — значение прошло через generic функцию совершенно без изменений.
Задание
ЛегкоОбобщённая функция identity из предыдущего урока уже находится в вашем редакторе. Используйте её вывод типов на практике.
Создайте три переменные, позволяя анализатору вывести T (аннотации не требуются):
word— вызовитеidentityс"Luau"count— вызовитеidentityс12flag— вызовитеidentityсfalse
Выведите следующее, каждое на отдельной строке:
word- результат
typeof(word) count- результат
typeof(count) flag- результат
typeof(flag)
Попробуйте сами
-- Обобщённая функция identity из предыдущего урока
local function identity<T>(value: T): T
return value
end
-- Напишите код здесь
-- 1) создайте word, count и flag с вызовами identity (пусть T выводится)
-- 2) выведите каждое значение, за которым следует его typeof
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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Обобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функции