Love2D: Типы в Lua

Руководство по 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
с возможными дополнениями и изменениями

Просмотров: 6 543

ScorpioT1000 #1 - 6 лет назад 1
в Lua нет отдельного целочисленного типа.
наверно самая главная проблема луа =)
на деле можно имплементировать бинарные операторы и специальный юзертип int32 / int64
bin32 in lua
Нельзя отождествлять потоки Lua с потоками операционной системы.
это тоже от программиста, кто пишет оболочку зависит
можно реализовать свои потоки и синк для юзания в луа
prog #2 - 6 лет назад 0
Замечу, что Lua можно интегрировать не только в C или C++, хотя именно на такую интеграцию он и рассчитан. Например, есть Java обертка над библиотекой Lua, не путать с реализацией Lua на джаве, такая тоже есть, но это для извращенцев.
ScorpioT1000, не такая и проблема, если учитывать что арифметические действия в Lua это самый ресурсоемкий процесс и не делать в Lua лишних вычислений.
Что касается побитовых операций, то в 5.2, если не ошибаюсь, для этого в появилась библиотека, правда работает она довольно специфично.
Что касается интов как таковых - не сталкивался ни с жесткой необходимостью их использования (без выхода за 52 бита целые числа ведут себя в Lua как положено, не смотря на свою плавающую природу), зато видел экзотическое решение - использование только целых чисел (числовой тип был насильственно заменен на long int).
ScorpioT1000 #3 - 6 лет назад 0
не сталкивался ни с жесткой необходимостью их использования
индексы для массивов? сто опций в одном интежере? целочисленная арифметика? хранение и оперирование с указателями и хендлами? массив интов как байтов для шифрования? (строка не всегда для этого полезна)
prog #4 - 6 лет назад 0
ScorpioT1000, в lua с этим отлично справляется то что есть. Указатели и хендлы не должны доходить до луа, если это происходит - что-то не так с архитектурой. Индексы для массивов - в луа нет массивов в классическом их смысле, только ассоциативные, которые отлично понимают тот тип что используется в Lua и даже проводят оптимизацию если это возможно. Массив интов как байтов для шифрования - этим не должен заниматься Lua, а если все-же занимается, то есть в 5.2 библиотека bin32. Cто опций в одном интежере (на деле их все-же не сто, правда?), целочисленная арифметика - та-же библиотека bin32 из 5.2 версии lua.
Хочу подчеркнуть, что Lua не позиционируется как самостоятельный язык программирования - он разработан и предназначен преимущественно для интеграции в существующие системы на других языках. Можно привести тысячу примеров того, что сложно или непродуктивно или невозможно реализовать на Lua, но все они относятся к задачам, которые Lua и не должен выполнять по своей природе. В контексте платформы Love2D это, конечно, имеет несколько другой смысл - тут порой приходится писать на Lua всякое непотребство, но попытка слишком много переложить на Lua это не проблема самого Lua.
nuts119 #5 - 6 лет назад 1
Незначительная опечатка:
Мы может присвоить переменной...
Мы можем присвоить переменной... :)
ScorpioT1000 #6 - 6 лет назад (отредактировано ) 0
prog, ты честно бред говоришь сейчас =) давайте еще булы и флоаты выпилим и я могу щас твой пост так же под то что они не нужны подвести типа всё может быть стрингами...
джасс тоже не предназначался для всего этого, однако
Андреич #7 - 6 лет назад (отредактировано ) 0
Незначительная опечатка:
Мы может присвоить переменной...
Мы можем присвоить переменной... :)
исправил...
prog #8 - 6 лет назад 0
ScorpioT1000, ну булы нынче во многих языках занимают не меньше места чем инт в виде отдельных переменных, более того, в некоторых языках true и false это синтаксический сахар, а на деле используется 0 и 1. Что касается флоатов - падение производительности будет слишком большое если их заменить строками. Что касается джасcа, то не стоит путать работу в рамках закрытой системы, когда нет другого выбора и разработку своего приложения с использованием нормального языка в качестве основы, а Lua в качестве скрипта. Так что это еще вопрос кто тут бред пишет.
Еще раз подчеркну что я не рассматриваю сейчас особенности работы с Love2D.
ScorpioT1000 #9 - 6 лет назад 0
Ну так надо думать о своих юзерах =) они тоже хотят полноценный язык! чВ
prog #10 - 6 лет назад 0
ScorpioT1000, ну так кто мешает запилить для этого нужные нативки в ядре и вызывать их с помощью луа?
ScorpioT1000 #11 - 6 лет назад 0
я, в принципе, об этом и написал