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