0Pricing
Lua Academy · Урок

Обзор типов данных 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))       -- nil

nil: отсутствие значения

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") end

number: целые числа и числа с плавающей точкой

В 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"]) -- 30

function: значения первого класса

Функции в 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, Lua

userdata и 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обзор типов данных Lua
  2. Объявление переменных в Lua
  3. Арифметические и реляционные операторы
  4. Приведение и преобразование типов
← Назад к Lua Academy