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