Краткий обзор восьми базовых типов данных в Lua: number, string, boolean, table, function, nil, userdata, thread.
Числа
Числовой тип представлен вещественными числами (обычно в Lua это числа с плавающей точкой двойной точности). в Lua нет отдельного целочисленного типа.
Доступны простейшие арифметические выражения:
> print(2+2) -- сложение
4
> print(2-7) -- вычитание
-5
> print(7*8) -- умножение
56
> print(7/8) -- деление
0.875
Обратите внимание, результат вычислений не округляется до целых чисел. Они так и остаются вещественными числами.
Присвоение значений переменным выполняется оператором =
Присвоение значений переменным выполняется оператором =
> x = 7 -- присвоение переменной х значения 7
> print(x) -- выводит значение переменной
7
Теперь мы можем использовать переменную х для других вычислений:
> x = x * 9
> print(x)
63
> print(x*2) -- в данном случае значение х не изменится
126
> print(x)
63
Строки
В Lua также есть и строковой (текстовый) тип. Чтобы создать строку поместите текст "в кавычки" (можно использовать и 'одинарные кавычки')
> print("hello")
hello
Мы можем присвоить переменной значение строки, так же, как делали с числами:
> who = "Lua user"
> print(who)
Lua user
Можно соединять строки оператором .. (две точки)
> print("hello ")
hello
> print("hello " .. who)
hello Lua user
> print(who)
Lua user
В отличие от прочих языков программирования, в Lua нельзя соединять строки оператором +
> message = "hello " + who -- выдаст ошибку
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: ?
Логический тип
Логические переменные имеют всего два значения: true (истина) и false (ложь). Если значение не равно true,оно равно false и наоборот.
Добавте оператор not перед логическим значение, чтобы обратить его:
not true равно false
Добавте оператор not перед логическим значение, чтобы обратить его:
not true равно false
> x = true
> print(x)
true
> print(not x)
false
> print(not false)
true
Логические переменные представляют результат логических проверок. Операторы == (равно), и ~= (не равно) вернут логическое значение, в зависимости от переданного им значения:
> print(1 == 0) -- проверка на равенство чисел
false
> print(1 == 1)
true
> print(1 ~= 0) -- проверка на неравенство чисел
true
> print(true ~= false)
true
Примечание: для присвоения значения переменным используется оператор =,но для сравнения используется ==. Операторы похожи, и их часто путают.
Таблицы
Таблицы являются самым важным типом данных в Lua и являются фундаментом для пользовательских типов данных, таких как структуры, массивы, списки, множества. Таблица в Lua представляет собой набор пар — (Ключ, Значение). Ключом может выступать значение любого типа, кроме nil..
таблица создаётся парой фигурных скобок {}
> x = {}
> print(x)
table: 0035C910
Функции
В Lua функции можно назначать переменным (как строки и числа). Функции создаются с использование ключевого слова function. Функции должны заканчиваться словом end
> foo = function () print("hello") end -- объявление функции
> foo() -- вызов функции
hello
> print(foo)
function: 0035D6E8
Можно выводить значение функции, в этом случае отобразится её уникальный индификатор. Функции в Lua являются таким же типом как и все остальные, это значит, их можно присваивать переменным, передавать в другие функции и возвращать.
Функция может входить в таблицу:
> a = "aeiou" -- строка
> b = 13 -- число
> c = function() -- функция
> print ("\n\n\tAin't it grand")
> end
> d = { a, b ,c} -- добавление переменных в таблицу
> for key, value in ipairs(d) do print(key, type(value)) end -- напечатать тип значений в таблице d
> end
1 string
2 number
3 function
Неопределённое значение
nil - особый тип, обозначающий отсутствие пригодного значения. Если вы используете несуществующие значение, то получите nil
> print(x)
nil
> x = 2.5
> print(x)
2.5
Пользовательские данные
Тип пользовательских данных (userdata) позволяет хранить любые данных из C в переменных Lua. Значение этого типа является ссылкой на блок физической памяти и не имеет предопределенных операций в Lua, за исключением присваивания и проверки на равенство. Значения типа userdata не могут быть созданы или изменены непосредственно в Lua, это возможно только с помощью C API. Однако, используя метатаблицы, можноопределить операции над значениями этого типа.
Потоки
Тип thread (поток) обозначает независимый поток исполнения и используется при реализации механизма сопрограмм. Нельзя отождествлять потоки Lua с потоками операционной системы.
Динамическая типизация
Как вы уже заметили, при присвоении значений переменным мы не указываем их тип:
a = 1
b = "hello"
c = {}
В других языках (языках строгой типизации), например в С, мы должны указывать тип переменной при создании. в Lua же можно присваивать разные значение одним переменным:
a = 1
a = "hello"
a = {}
Это называется динамической типизацией: нет нужды указывать тип переменных, тип определяется по значению.
Используйте функцию type(), чтобы узнать тип объектов:
> x = "123" -- строка
> print(x, type(x)) -- напечатает значение и тип переменной
123 string
> x = x + 7 -- сложим переменную с числом
> print(x, type(x)) -- и вновь выведем значение и тип
130 number
данная статья является вольным переводом с сайта lua-users.org
с возможными дополнениями и изменениями
с возможными дополнениями и изменениями
можно реализовать свои потоки и синк для юзания в луа
Что касается побитовых операций, то в 5.2, если не ошибаюсь, для этого в появилась библиотека, правда работает она довольно специфично.
Что касается интов как таковых - не сталкивался ни с жесткой необходимостью их использования (без выхода за 52 бита целые числа ведут себя в Lua как положено, не смотря на свою плавающую природу), зато видел экзотическое решение - использование только целых чисел (числовой тип был насильственно заменен на long int).
Ред. ScorpioT1000
джасс тоже не предназначался для всего этого, однако
Ред. Алексей Андреич