5.15. Знаки препинания
Знаки препинания
Для новичков один из самых частых источников путаницы — что означают символы вроде .., ;, ' или :, особенно когда они встречаются в непривычных комбинациях. В Lua многие знаки работают иначе, чем в других языках (например, JavaScript или Python), поэтому важно чётко понимать их назначение.
- Кавычки (
'и"). В Lua оба типа кавычек допустимы для строк, и выбор зависит только от содержимого строки и стиля кода.
local name = "Тимур"
local message = 'Hello from Lua!'
Оба варианта работают одинаково. Разница — только в удобстве экранирования. Удобно использовать двойные кавычки, если внутри строки есть апостроф:
local text = "It's a beautiful day"
Удобно использовать одинарные, если внутри есть цитата:
local quote = 'He said, "Welcome!"'
- Апострофы (
’), например,“smart quotes”из Word — не являются частью синтаксиса и вызовут ошибку:
local wrong = “This won’t work” -- ОШИБКА: неверные кавычки
- Точки с запятой (
;) — опциональны, но редко используются. В Lua точки с запятой не обязательны. Интерпретатор автоматически определяет конец выражения (по аналогии с ASI в JavaScript, но проще).
print("Hello")
local x = 10
local y = 20
Вы можете использовать ;, если хотите:
print("Hello"); local x = 10; local y = 20;
Но в сообществе Lua принято не ставить точки с запятой, если только вы не пишете несколько выражений в одной строке.
- Запятая (
,) — разделитель элементов. Используется повсеместно для разделения параметров функций, элементов таблиц и нескольких значений при присваивании.
-- Параметры функции
function greet(name, age)
print(name .. " is " .. age .. " years old")
end
-- Таблица
local colors = {"red", "green", "blue"}
-- Множественное присваивание
local x, y, z = 1, 2, 3
В отличие от JavaScript, в таблицах можно ставить запятую после последнего элемента — это не ошибка:
local fruits = {
"apple",
"banana",
}
Это удобно при добавлении новых элементов — не нужно менять предыдущую строку.
- Точка (
.) и двоеточие (:) — доступ к полям и методам. Это одна из ключевых особенностей Lua, особенно при работе с таблицами и ООП. Чтобы получить доступ к полю или вызвать функцию, нужно поставить точку.
Пример:
local person = {name = "Bob", age = 30}
print(person.name) -- -> "Bob"
function person.greet()
print("Hi, I'm " .. person.name)
end
person.greet() -- вызов функции
Вызывать методы можно через двоеточие, это синтаксический сахар для передачи объекта как первого аргумента (self).
function person:greet()
print("Hi, I'm " .. self.name) -- self = person
end
person:greet() -- то же самое, что person.greet(person)
То есть, эти два метода будут эквивалентны:
person:greet()
person.greet(person)
- Две точки (
..) — конкатенация строк. В Lua нет оператора+для строк (как в JavaScript). Вместо этого используются две точки.
local first = "Hello"
local last = "World"
local full = first .. ", " .. last -- -> "Hello, World"
Будьте осторожны: .. имеет низкий приоритет, лучше брать в скобки при смешивании с числами:
print("Value: " .. 5 + 3) -- ОШИБКА: попытка склеить строку и результат 5+3
print("Value: " .. (5 + 3)) -- ПРАВИЛЬНО: -> "Value: 8"
- Подчёркивание (
_) — соглашения и именование. Как и в других языках,_используется по стилю, но не имеет специального смысла для интерпретатора.
_ часто используется как имя «игнорируемой» переменной, часто используется в циклах for, когда индекс не нужен:
for _, value in ipairs(fruits) do
print(value)
end
_name — соглашение о внутреннем/приватном поле:
local config = {
_api_key = "12345", -- не для внешнего использования
public_url = "https://..."
}
Это не приватность, просто сигнал другим разработчикам.
__name — зарезервировано для метаметодов:
mt.__index = function() ... end
mt.__add = function() ... end
Такие имена — часть механизма метатаблиц.
_ в числах (Luau) — читаемость:
local billion = 1_000_000_000 -- работает в Luau
В Luau (но не в классическом Lua) можно использовать _ как разделитель. В стандартном Lua это вызовет ошибку.
Вот важное отличие от JavaScript, C# и Java:
- Lua не имеет побитовых операторов
|,&,^в ядре (до версии 5.2). - Нет логических
||и&&— вместо них используются or и and.
В Lua используются слова:
if x == 1 or y == 2 then
print("At least one condition is true")
end
if x == 1 and y == 2 then
print("Both conditions are true")
end
local result = a or "default" -- как ?? в C# или || в JS
Это делает код более читаемым, но менее компактным.
В Lua 5.3+ появились побитовые операторы: |, &, ~, <<, >>.
В Roblox (Luau) они также поддерживаются. Но записываются они через C-подобные символы, а не слова. Однако в Lua 5.1 (часто используемом как база) этих операций нет — нужно использовать библиотеки вроде bit32.
local flags = permission_read | permission_write
Важно учесть кое-что ещё. В классическом Lua : (двоеточие) используется только для вызова методов с self. В Luau : также используется для аннотаций типов.
-- Luau:
local name: string = "Alice"
function greet(name: string): string
return "Hello, " .. name
end
Это не работает в чистом Lua — будет ошибка синтаксиса. И если видите : type, значит, код написан для Roblox Studio или Luau CLI.
В Lua нет шаблонных строк, как в JavaScript (Hello ${name}). Чтобы вставлять переменные в строки, используйте конкатенацию:
local name = "Timur"
print("Hello, " .. name .. "!") -- единственный способ
Lua делает ставку на читаемость и простоту, поэтому использует слова вместо символов (or, and), отказывается от лишних знаков (;), даёт гибкость через таблицы и метатаблицы. Поэтому, если вы уже знакомы с другими скриптовыми языками, может быть непривычно.