Использование обобщенной функции
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 63 из 80.
Ты никогда не указываешь 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: значение прошло через обобщённую функцию совершенно неизменённым.
Задание
ЛегкоПозволь проверяющей системе определить T при каждом вызове.
- Под функцией сохрани
identity("Oslo")вlocal city, аidentity(42)— вlocal floors, без аннотаций. - Выведи
typeof(city), затемtypeof(floors).
Нажми «Запустить код»: вывод покажет string и number.
Попробуйте сами
-- Обобщённая функция identity из прошлого урока
local function identity<T>(value: T): T
return value
end
-- 1) city и floors из вызовов identity, без аннотаций
-- 2) вывести typeof для каждого
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображения6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблиц9Обобщения (Generics): первое знакомство
Проблема, которую решают GenericsОбобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функцииПотренируйтесь самостоятельно: Онлайн-компилятор Luau