Обзор типов данных Lua
Изучите типы nil, boolean, number, string, table, function и userdata.
«Обзор типов данных Lua» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Добро пожаловать в Lua
Lua — это лёгкий, быстрый и встраиваемый скриптовый язык, используемый в игровых движках, веб-серверах и встраиваемых системах. Прежде чем писать настоящие программы, необходимо понять, как Lua представляет данные.
В Lua есть 8 базовых типов: nil, boolean, number, string, table, function, userdata и thread. Каждое значение в Lua принадлежит ровно одному из этих типов.
-- Check the type of any value with type()
print(type(42)) -- number
print(type("hello")) -- string
print(type(true)) -- boolean
print(type(nil)) -- nilnil: отсутствие значения
nil — это способ Lua представить ничто или отсутствие значения. Это единственное значение своего типа. Переменные, которым никогда не присваивалось значение, автоматически содержат nil.
Присваивание nil глобальной переменной фактически удаляет её. В таблицах установка ключа в nil полностью удаляет соответствующую запись.
-- Unassigned variables are nil
print(x) -- nil
x = 10
print(x) -- 10
x = nil
print(x) -- nil (variable is gone)boolean: true и false
Тип boolean имеет ровно два значения: true и false. Правила истинности в Lua просты, но важны: ложными считаются только nil и false. Все остальные значения, включая число 0 и пустую строку "", считаются истинными.
Это отличается от многих языков, где 0 или "" считаются ложными.
-- Lua truthiness examples
if 0 then print("0 is truthy!") end -- prints!
if "" then print("empty str is truthy!") end -- prints!
if nil then print("nil") else print("nil is falsy") end
if false then print("false") else print("false is falsy") endnumber: целые числа и числа с плавающей точкой
В Lua 5.3+ у типа number есть два подтипа: целое число и число с плавающей точкой. Целые числа представлены точными 64-битными значениями, а числа с плавающей точкой используют IEEE 754 двойной точности. В Lua 5.1/5.2 все числа имеют двойную точность.
Функция math.type() различает эти два подтипа. Деление с помощью / всегда возвращает число с плавающей точкой; // (целочисленное деление с округлением вниз) возвращает целое число, если оба операнда являются целыми числами.
print(type(10)) -- number
print(type(10.5)) -- number
print(math.type(10)) -- integer
print(math.type(10.5))-- float
print(10 / 3) -- 3.3333...
print(10 // 3) -- 3 (floor division)string: текст в Lua
Строки в Lua — это неизменяемые последовательности байтов. Их можно заключать в одинарные или двойные кавычки, а для многострочных строк использовать длинные скобки [[...]]. Строки в длинных скобках игнорируют первый перевод строки, а всё остальное сохраняют буквально.
Строки Lua интернируются, поэтому одинаковые строки используют общую область памяти. Оператор длины # возвращает количество байтов.
local s1 = 'single quotes'
local s2 = "double quotes"
local s3 = [[multi-line
long string]]
print(#s1) -- 13
print(type(s1)) -- string
print(s1 .. " works") -- concatenation with ..table: универсальный контейнер
Тип table — единственная составная структура данных Lua, но её возможностей достаточно для реализации массивов, словарей, объектов, множеств и многого другого. Таблицы являются ассоциативными массивами: они сопоставляют ключи значениям, причём ключом может быть любое значение, кроме nil и NaN.
Таблицы создаются с помощью фигурных скобок {}. В таблицах, используемых как массивы, целочисленные ключи начинаются с 1.
-- Array style
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- apple (1-indexed!)
-- Dictionary style
local person = {name = "Alice", age = 30}
print(person.name) -- Alice
print(person["age"]) -- 30function: значения первого класса
Функции в Lua являются значениями первого класса типа function. Их можно сохранять в переменных, передавать как аргументы и возвращать из других функций. Благодаря этому Lua хорошо подходит для функциональных шаблонов программирования.
Функции можно определять с помощью ключевого слова function или присваивать анонимные функции переменным. Оба варианта эквивалентны.
-- Two equivalent ways to define a function
function greet(name)
return "Hello, " .. name
end
local greet2 = function(name)
return "Hello, " .. name
end
print(type(greet)) -- function
print(greet("Lua")) -- Hello, Luauserdata и thread
userdata представляет произвольные данные C, которыми управляет хост-приложение. Создать userdata на чистом Lua нельзя — это значение поступает из расширений C или сред встраивания, например игровых движков. Оно позволяет коду C предоставлять объекты скриптам Lua.
thread представляет сопрограммы — независимые потоки выполнения со своими стеками. Сопрограммы будут подробно рассмотрены в отдельном уроке. Пока достаточно знать, что coroutine.create() возвращает значение типа thread.
-- thread type via coroutine
local co = coroutine.create(function()
print("coroutine body")
end)
print(type(co)) -- thread
-- userdata comes from C, not creatable in pure Lua
-- type(io.stdin) == "file" is a userdata variantПроверка значений с помощью type()
Встроенная функция type() всегда возвращает строку с названием типа своего аргумента. Это полезно для защитного программирования и отладки. Результат можно напрямую сравнивать со строками, содержащими имена типов.
Обратите внимание: type(nil) возвращает строку "nil", а не само значение nil. Это позволяет безопасно проверять, содержит ли переменная nil, не вызывая ошибок.
local values = {42, "hi", true, nil, {}, function() end}
-- Note: nil in table stops ipairs early
for i = 1, 3 do
print(i, type(values[i]))
end
-- 1 number
-- 2 string
-- 3 booleanОтличия типов от других языков
Если Вы знакомы с JavaScript, Python или Java, некоторые правила типов Lua могут Вас удивить. Отдельный тип целых чисел, видимый через type(), отсутствует: и целые числа, и числа с плавающей точкой возвращают "number". У массивов нет собственного типа — это просто таблицы. Классов не существует: объекты представляют собой таблицы с метатаблицами.
Понимание этих отличий помогает избежать распространённых ошибок при переходе между языками.
-- No separate array type
local arr = {1, 2, 3}
print(type(arr)) -- table (not array!)
-- No separate integer type visible
print(type(1)) -- number
print(type(1.0)) -- number
-- math.type distinguishes
print(math.type(1)) -- integer
print(math.type(1.0)) -- floatБыстрая проверка
Что возвращает type(0) в Lua?
Итоги: обзор типов данных Lua
Вы изучили все 8 типов Lua:
- nil — отсутствие значения; ложное значение
- boolean — true/false; ложными являются только nil и false
- number — целое число или число с плавающей точкой; для различения используйте math.type()
- string — неизменяемые последовательности байтов; для объединения используйте ..
- table — универсальный контейнер для массивов и словарей
- function — значения первого класса, которые можно сохранять в переменных
- userdata — данные C, предоставленные Lua
- thread — дескрипторы сопрограмм
Далее: объявление переменных — глобальная и локальная область видимости.
Часто задаваемые вопросы
Урок «Обзор типов данных Lua» бесплатный?
Да — полный текст урока «Обзор типов данных Lua» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обзор типов данных Lua»?
Изучите типы nil, boolean, number, string, table, function и userdata. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Обзор типов данных Lua»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обзор типов данных Lua
- Объявление переменных в Lua
- Арифметические и реляционные операторы
- Приведение и преобразование типов