English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lua является динамическим языком программирования, переменные не требуют типа определения, достаточно присвоить им значение. Значения могут храниться в переменных, передаваться в качестве параметров или возвращаться в качестве результатов.
В Lua есть 8 основных типов: nil, boolean, number, string, userdata, function, thread и table.
Тип данных | Описание |
---|---|
nil | Самый простой, только значение nil относится к этому классу, что означает недействительное значение (в условиях выражения эквивалентно false). |
boolean | включает два значения: false и true. |
number | представляет собой двойную точность реального числа |
string | Строки представляются двойными или одинарными кавычками |
function | функции, написанные на C или Lua |
userdata | 表示存储在变量中的C数据结构 |
thread | 表示独立执行的线路,用于执行协同程序 |
table | В Lua таблица (table) является "ассоциативным массивом" (associative arrays), индексом массива может быть цифра, строка или таблица. В Lua, создание таблицы выполняется через "конструктивное выражение", simplest expression для создания пустой таблицы — это {}. |
Мы можем использовать функцию type для тестирования типа переменной или значения:
print(type("Hello world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil print(type(type(X))) --> string
Тип nil представляет собой тип без какого-либо действительного значения, у него только один значение -- nil, например, печать переменной, не имеющей значения, будет выводить значение nil:
> print(type(a)) nil >
Для глобальных переменных и table nil также имеет "удаление" функцию, присвоение nil значению глобальной переменной или переменной в table равно удалению их, выполнение следующего кода покажет:
tab1 = { key1 = "val1", key2 = "val2", "val3" } for k, v in pairs(tab1) do print(k .. " - " .. v) end tab1.key1 = nil for k, v in pairs(tab1) do print(k .. " - " .. v) end
> type(X) nil > type(X)==nil false > type(X)=="nil" true >
результат type(X)==nil false причина этого в том, что type(X) по сути возвращает строку "nil", которая является типом string:
type(type(X))==string
Тип boolean имеет только два возможных значения: true (истина) и false (ложь), Lua рассматривает false и nil как false, все остальное как true, и число 0 также true:
print(type(true)) print(type(false)) print(type(nil)) if false or nil then print("по крайней мере один из них true") else print("false и nil оба являются false") end if 0 then print("число 0 является true") else print("число 0 является false") end
Результат выполнения следующего кода будет следующим:
$ lua test.lua boolean boolean nil false и nil оба являются false число 0 является true
Lua по умолчанию имеет только один тип числа -- тип double (двоеточие) (тип по умолчанию можно изменить в файле luaconf.h), следующие способы записи рассматриваются как тип числа:
print(type(2)) print(type(2.2)) print(type(0.2)) print(type(2e+1)) print(type(0.2e-1)) print(type(7.8263692594256e-06))
Результат выполнения следующего кода:
number number number number number number
Строка представлена парой двойных или одинарных кавычек.
string1 = "this is string1" string2 = 'this is string2'
Вы также можете использовать две квадратные скобки "[[]]", чтобы представить "блок" строки.
html = [[ <html> <head></head> <body> <a href="http://ru.oldtoolbag.com/">Базовый учебник</a> </body> </html> ]] print(html)Результат выполнения следующего кода:
<html> <head></head> <body> <a href="http://ru.oldtoolbag.com/">Базовый учебник</a> </body> </html>
Когда вы выполняете арифметические операции над строкой чисел, Lua пытается преобразовать эту строку чисел в число:
> print("2" + 6) 8.0 > print("2" + "6") 8.0 > print("2 + 6") 2 + 6 > print("-2e2" * "6") -1200.0 > print("error" + 1) stdin:1: attempt to perform arithmetic on a string value stack traceback: stdin:1: in main chunk [C]: in ? >
В приведенном выше коде "error" + 1 вызовет ошибку, для соединения строк используется .. , например:
> print("a" .. 'b') ab > print(157 .. 428) 157428 >
Использование # для вычисления длины строки, ставьте перед строкой, как в следующем примере:
> len = "ru.oldtoolbag.com" > print(#len) 14 > print(#"ru.oldtoolbag.com") 14 >
В Lua создание таблицы выполняется через "выражение конструктора", simplest expression is {}, which is used to create an empty table. You can also add some data to the table and initialize it directly:
-- создание пустой таблицы local tbl1 = {} -- прямое инициализирование таблицы local tbl2 = {"apple", "pear", "orange", "grape"}
В Lua таблицы (table)其实是 "ассоциативные массивы" (associative arrays), индекс массива может быть как числовым, так и строковым.
-- файл скрипта table_test.lua a = {} a["key"] = "value" key = 10 a[key] = 22 a[key] = a[key] + 11 for k, v in pairs(a) do print(k .. " : " .. v) end
Результат выполнения скрипта:
$ lua table_test.lua key : value 10 : 33
В отличии от других языков программирования, в Lua таблицы имеют начальный индекс 1, а не 0.
-- файл скрипта table_test2.lua local tbl = {"apple", "pear", "orange", "grape"} for key, val in pairs(tbl) do print("Key", key) end
Результат выполнения скрипта:
$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4
Таблица не имеет фиксированной длины, при добавлении новых данных длина таблицы автоматически увеличивается, все начальные таблицы являются nil.
-- файл скрипта table_test3.lua a3 = {} for i = 1, 10 do a3[i] = i end a3["key"] = "val" print(a3["key"]) print(a3["none"])
Результат выполнения скрипта:
$ lua table_test3.lua val nil
В Lua функция рассматривается как "первый класс значения (First-Class Value)". Функция может существовать в переменной:
-- файл скрипта function_test.lua функция factorial1(n) if n == 0 then возврат 1 else возврат n * факториал1(n - 1) end end print(factorial1(5)) factorial2 = factorial1 print(factorial2(5))
Результат выполнения скрипта:
$ lua function_test.lua 120 120
Функция может передаваться в виде анонимной функции (anonymous function) через параметр:
--function_test2.lua скрипт файла function testFun(tab,fun) for k, v in pairs(tab) do print(fun(k,v)); end end tab={key1="val1",key2="val2"}; testFun(tab, function(key,val)--анонимная функция return key.."="..val; end );
Результат выполнения скрипта:
$ lua function_test2.lua key1 = val1 key2 = val2
В Lua,最主要的 поток — это координата (coroutine). Она похожа на поток (thread), имеет свою собственную стэк, локальные переменные и указатель инструкций, может делиться глобальными переменными и большинством других вещей с другими координатами.
Разница между потоками и координатами: потоки могут выполняться одновременно, в то время как координаты могут выполняться только одну в момент времени, и координаты, находящиеся в состоянии выполнения, останавливаются только при их приостановке (suspend).
userdata — это тип пользовательского данных, который используется для представления типа, созданного приложением или библиотекой языка C/C++, и позволяет хранить данные любого типа данных C/C++ (обычно struct и указатель) в переменной Lua для вызова.