lua - cheatsheet
Почти всё содрано отсюда: https://zserge.wordpress.com/2012/02/23/lua-%D0%B7%D0%B0-60-%D0%BC%D0%B8%D0%BD%D1%83%D1%82/
Комментарий - ‘–’
Скобки и ‘;’ писать не обязательно:
-- my first lua app: hello.lua
print "hello world";
print("goodbye world")
Условия, циклы
if/then/elseif/else/end
case - отсуствует
for i = 1, 10, 2 do … end
while a == ‘’ do … end
repeat … until a == ‘’
Выражения
- присваивание: x = 0
- арифметические: +, -, *, /, % (остаток от деления), ^ (возведение в степень)
- логические: and, or, not
- сравнение: >, <, ==, <=, >=, ~= (не-равно)
- конкатенация строк (оператор “..”)
- длина/размер (оператор “#”): s=”hello”; a = #s (a будет равно 5).
- получение элемента по индексу, напр.: s[2]
Типы
- nil
- булева логика (true/false)
- числа (numbers) — без деления на целые/вещественные. Просто числа.
- строки
- функции
- поток (thread)
- произвольные данные (userdata)
- таблица (table) = hash/array/struct/class
a[‘test’] ~ a.test
создание таблицы:
t = {
a = 3,
b = 4
}
for key, value in pairs(t) do
print(key, value) -- выведет "a 3", потом "b 4"
end
Итерация:
u={}; u[1]="a"; u["x"]="z"
-- Только цифровые ключи!!! Зато в правильном порядке
for key,value in ipairs(u) do print(key,value) end
-- 1 a
-- Все ключи, но в случайном порядке
for key,value in pairs(u) do print(key,value) end
-- 1 a
-- x z
Размер таблицы можно получить только явно перебрав все элементы и посчитав. #имя не работает!
Функции
function add(a, b)
return a + b
end
Можно возвращать несколько аргументов.
Переменное число оагрументов:
function sum(...)
s = 0
for _, n in pairs(arg) do -- в функции обращаются к ним, как к таблице "arg"
s = s + n
end
return a
end
Объекты
lamp = { on = false turn_on = function(l) l.on = true end }
lamp.turn_on(lamp) lamp:turn_on() lamp[‘turn_on’](lamp) – все три варианта эквивалентны
function lamp:turn_off() self.on = false end – добавить метод на лету
Специальные функции
Некоторые имена функций таблиц (методов) зарезервированы, и они несут особый смысл:
- __add(a, b), __sub(a, b), __div(a, b), __mul(a, b), __mod(a, b), __pow(a, b) — вызываются, когда выполняются арифметические операции над таблицей
- __unm(a) — унарная операция «минус» (когда пишут что-то типа «x = -x»)
- __lt(a, b), __le(a, b), __eq(a, b) — вычисляют результат сравнения (<, <=, ==)
- __len(a) — вызывается, когда делается “#a”
- __concat(a, b) — вызывается при “a..b”
- __call(a, …) — вызывается при “a()”. Переменные аргументы — это аргументы при вызове
- __index(a, i) — обращение к a[i], при условии, что такого элемента не существует
- __newindex(a, i, v) — создание “a[i] = v”
- __gc(a) — когда объект удаляется при сборке мусора
Подменяя эти методы, можно перегружать операторы и использовать синтаксис языка для своих целей.
Наследование
Реального наследования нет, т.к. нет классов. Но можно притащить методы из другого объекта:
superlamp = {
brightness = 100
}
-- указываем родительскую таблицу
setmetatable(superlamp, lamp)
-- и ее методы теперь доступны
superlamp:turn_on()
superlamp:turn_off()
Системные вызовы
Popen:
local handle = io.popen(command)
local result = handle:read("*a")
handle:close()
Чтение/запись в файл:
-- Opens a file in read
file = io.open("test.lua", "r") -- r,w,a,r+,w+,a+ + - create in not exists
-- sets the default input file as test.lua
io.input(file)
-- prints the first line of the file
print(io.read())
-- closes the open file
io.close(file)
-- Opens a file in append mode
file = io.open("test.lua", "a")
-- sets the default output file as test.lua
io.output(file)
-- appends a word test to the last line of the file
io.write("-- End of the test.lua file")
-- closes the open file
io.close(file)
Чтение строк файла:
-- see if the file exists
function file_exists(file)
local f = io.open(file, "rb")
if f then f:close() end
return f ~= nil
end
-- get all lines from a file, returns an empty
-- list/table if the file does not exist
function lines_from(file)
if not file_exists(file) then return {} end
local lines = {}
for line in io.lines(file) do
lines[#lines + 1] = line
end
return lines
end