Обобщенная функция тождественности
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 58 из 73.
Вот функция identity, сделанная правильно — как обобщённая функция:
local function identity<T>(value: T): T
return value
endЗапись <T> после имени функции объявляет параметр типа — заполнитель, который означает «некоторый тип, определяемый при каждом вызове». Внутри сигнатуры вы используете T точно так же, как реальный тип: параметр имеет тип T, и функция возвращает T.
Использование одного и того же T для входа и выхода — в этом и заключается весь трюк: это связывает их вместе. Вызовите identity("hello"), и анализатор решает, что T = string для этого вызова, поэтому результат — string. Вызовите identity(42), и T = number, поэтому результат — number. Одно тело, любой тип, ничего не потеряно.
T — это лишь общепринятое имя (сокращение от «Type»), с таким же успехом подойдут <Item> или <Value>. И, как всегда в Luau, угловые скобки существуют только для анализатора: во время выполнения это обычная функция Lua function identity(value) return value end.
Задание
ЛегкоСоздайте generic-функцию с именем identity, которая:
- объявляет параметр типа
T - принимает один параметр с именем
valueтипаT - возвращает это значение с типом возвращаемого значения
T
Затем создайте следующие типизированные переменные, используя вашу функцию:
luckyNumberтипаnumber— вызовитеidentityс7greetingтипаstring— вызовитеidentityс"Hello, Luau!"isReadyтипаboolean— вызовитеidentityсtrue
Выведите на экран следующее, каждое с отдельной строки:
luckyNumbergreetingisReady- результат вызова
identityс"generics"прямо внутриprint - результат вызова
identityс99прямо внутриprint
Попробуйте сами
-- Напишите код здесь
-- 1) определите identity<T>(value: T): T
-- 2) создайте luckyNumber, greeting и isReady с вызовами identity
-- 3) выведите их, затем выведите identity("generics") и identity(99)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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Обобщенная функция тождественностиИспользование обобщенной функцииОбобщенные массивыОбобщенные псевдонимы типовИтоги: обобщенные функции