Menu
CoddyTech

Использование обобщенной функции

Часть раздела Введение в 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: значение прошло через обобщённую функцию совершенно неизменённым.

challenge icon

Задание

Легко

Позволь проверяющей системе определить T при каждом вызове.

  1. Под функцией сохрани identity("Oslo") в local city, а identity(42) — в local floors, без аннотаций.
  2. Выведи typeof(city), затем typeof(floors).

Нажми «Запустить код»: вывод покажет string и number.

Попробуйте сами

-- Обобщённая функция identity из прошлого урока
local function identity<T>(value: T): T
    return value
end

-- 1) city и floors из вызовов identity, без аннотаций
-- 2) вывести typeof для каждого

Все уроки раздела Введение в Luau

Потренируйтесь самостоятельно: Онлайн-компилятор Luau