Как оформлять код на Lua

Сокращённая версия моего гайда с BLAST.HK (январь 2021): правила, по которым чужой Lua-код читается как свой.

Автор: Опубликовано: Обновлено: 1 мин чтения

В январе 2021 года я выложил на BLAST.HK гайд по оформлению Lua-кода. Основа – открытые источники, прежде всего style guide Хишама Мухаммада, одного из авторов LuaRocks. Это рекомендации. Особенно они полезны, когда код читают другие – в open-source и в команде. Ниже – короткая выжимка с примерами.

Строки

Строки – в двойных кавычках. Одинарные оставьте для символов и строк, где внутри есть двойные:

local name = "Pavel_Garson"
local sep = ','
local msg = 'Он сказал: "привет"'

Имена

Функции и переменные – в snake_case. Функции, которые что-то проверяют, начинайте с is_. Над функцией коротко опишите аргументы и что она возвращает:

-- ped: хендл персонажа; возвращает true, если он в машине
local function is_in_vehicle(ped)
  return isCharInAnyCar(ped)
end

Отступы и строки

  • Отступ – 2–3 пробела, одинаково во всём файле.
  • Одна инструкция на строку.
  • Длинные строки и условия переносите.
  • Не выравнивайте = табами в соседних строках: при первой же правке выравнивание поедет.

Комментарии

После -- ставьте один пробел. Многострочный комментарий начинайте с новой строки и с отступом:

--[[
  Синхронизация игроков.
  Вызывается каждые 100 мс.
]]

Таблицы

Ключи пишите «как есть», квадратные скобки – только когда ключ лежит в переменной:

local cfg = { nick = "Pavel_Garson", rank = 5 }
cfg[field] = value

Вызовы

Скобки ставьте всегда, даже если аргумент один: require("socket"), а не require "socket". Для коротких условий подходит «тернарник» через and/or:

local label = is_online and "в сети" or "не в сети"

Он ломается, если среднее значение может быть false или nil, – в этом случае пишите обычный if.

Повторы

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

Частые вопросы

Какой стиль имён принят в Lua?

Для функций и переменных – snake_case. Функции-проверки удобно начинать с is_, например is_player_alive.

Какие кавычки использовать для строк в Lua?

По умолчанию двойные. Одинарные – для отдельных символов и строк, внутри которых есть двойные кавычки.

Нужно ли ставить скобки при вызове функции с одним аргументом в Lua?

Да, всегда: require("socket"), а не require "socket". Так вызов сразу видно.