Menu
CoddyTech

Проблема, которую решают Generics

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 61 из 80.

Представьте, что вам нужна функция, которая просто возвращает переданное ей значение: функция тождественности. С типами, которые вы уже знаете, у вас есть два варианта, и оба неудачны.

Первый вариант: написать отдельную копию для каждого типа. Тела функций одинаковы, различаются только аннотации:

local function echoNumber(value: number): number
    return value
end

local function echoString(value: string): string
    return value
end

Каждый новый тип означает ещё одну копию, а ошибку, исправленную в одной копии, нужно исправить во всех. Именно такого дублирования вы и избегаете, когда пишете функции.

Второй вариант: объединить их в одну функцию с типом any:

local function echo(value: any): any
    return value
end

Теперь одна функция справляется со всем, но за это приходится платить безопасностью типов. Когда вы вызываете echo("hello"), проверяющая система больше не знает, что результат — строка. Она знает только any, поэтому автодополнение перестаёт работать, а ошибки типов остаются незамеченными: связь между тем, что передали на вход, и тем, что получили на выходе, теряется.

На самом деле вам нужна функция, которая работает с любым типом и запоминает, какой тип использовался при каждом вызове. Именно это и дают обобщения, которым посвящена эта глава.

challenge icon

Задание

Легко

Посмотри, что забывает версия echo с типом any.

  1. Напиши local function echo(value: any): any, которая возвращает value.
  2. Сохрани echo("hello") в local result.
  3. Выведи result, затем typeof(result).

Нажми Run Code: вывод покажет hello и string.

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

-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) print result и typeof(result)

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

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