Добавлен , опубликован

Руководство по Lua 5.1

Содержание:
Краткий обзор восьми базовых типов данных в 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
    > 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
с возможными дополнениями и изменениями

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
37
11 лет назад
1
в Lua нет отдельного целочисленного типа.
наверно самая главная проблема луа =)
на деле можно имплементировать бинарные операторы и специальный юзертип int32 / int64
bin32 in lua
Нельзя отождествлять потоки Lua с потоками операционной системы.
это тоже от программиста, кто пишет оболочку зависит
можно реализовать свои потоки и синк для юзания в луа
0
24
11 лет назад
0
Замечу, что Lua можно интегрировать не только в C или C++, хотя именно на такую интеграцию он и рассчитан. Например, есть Java обертка над библиотекой Lua, не путать с реализацией Lua на джаве, такая тоже есть, но это для извращенцев.
ScorpioT1000, не такая и проблема, если учитывать что арифметические действия в Lua это самый ресурсоемкий процесс и не делать в Lua лишних вычислений.
Что касается побитовых операций, то в 5.2, если не ошибаюсь, для этого в появилась библиотека, правда работает она довольно специфично.
Что касается интов как таковых - не сталкивался ни с жесткой необходимостью их использования (без выхода за 52 бита целые числа ведут себя в Lua как положено, не смотря на свою плавающую природу), зато видел экзотическое решение - использование только целых чисел (числовой тип был насильственно заменен на long int).
0
37
11 лет назад
0
не сталкивался ни с жесткой необходимостью их использования
индексы для массивов? сто опций в одном интежере? целочисленная арифметика? хранение и оперирование с указателями и хендлами? массив интов как байтов для шифрования? (строка не всегда для этого полезна)
0
24
11 лет назад
0
ScorpioT1000, в lua с этим отлично справляется то что есть. Указатели и хендлы не должны доходить до луа, если это происходит - что-то не так с архитектурой. Индексы для массивов - в луа нет массивов в классическом их смысле, только ассоциативные, которые отлично понимают тот тип что используется в Lua и даже проводят оптимизацию если это возможно. Массив интов как байтов для шифрования - этим не должен заниматься Lua, а если все-же занимается, то есть в 5.2 библиотека bin32. Cто опций в одном интежере (на деле их все-же не сто, правда?), целочисленная арифметика - та-же библиотека bin32 из 5.2 версии lua.
Хочу подчеркнуть, что Lua не позиционируется как самостоятельный язык программирования - он разработан и предназначен преимущественно для интеграции в существующие системы на других языках. Можно привести тысячу примеров того, что сложно или непродуктивно или невозможно реализовать на Lua, но все они относятся к задачам, которые Lua и не должен выполнять по своей природе. В контексте платформы Love2D это, конечно, имеет несколько другой смысл - тут порой приходится писать на Lua всякое непотребство, но попытка слишком много переложить на Lua это не проблема самого Lua.
1
12
11 лет назад
1
Незначительная опечатка:
Мы может присвоить переменной...
Мы можем присвоить переменной... :)
0
37
11 лет назад
Отредактирован ScorpioT1000
0
prog, ты честно бред говоришь сейчас =) давайте еще булы и флоаты выпилим и я могу щас твой пост так же под то что они не нужны подвести типа всё может быть стрингами...
джасс тоже не предназначался для всего этого, однако
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.