Home Blog
en|ru

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
en|ru
Home Blog
Nickname sergzhum is registered!