Язык Lua

From FxCodeBaseWiki
(Redirected from Lua/ru)
Jump to: navigation, search

Lua

Что Такое Lua?

Lua является чрезвычайно быстрым, простым и мощным скриптовым языком, разработанным, реализованным и поддерживаемым PUC-Rio в Бразилии. Сильные стороны Lua были доказаны использованием Lua во многих критичных по времени приложениях, в том числе стратегиях реального времени, таких, как World of Warcraft. В настоящее время Lua входит в 20 самых популярных языков программирования в мире.

Официальный веб-сайт Lua: http://www.lua.org

Как Выглядит Lua ?

Синтаксис

С точки зрения синтаксиса Lua находится близко от семьи языков программирования Паскаль (Паскаль, ADA, Delphi). Нет синтаксического сахара, например, префикс/постфиксных операторов или присвоения значения внутри выражения, как в C++.

Сравните функцию факториала в C++, Pascal и Lua.

C++:

 int fact(int value)
 {
     if (value == 0)
        return 1;
     else
        return fact(value - 1) * value;
 }

Pascal:

 function fact(n: integer): longint;
 begin
     if (n = 0) then
         fact := 1
     else
         fact := n * fact(n - 1);
 end;

Lua:

 function fact(n)
    if n == 0 then
       return 1;
    else
       return fact(n - 1) * n;
    end
 end

Концепции

С точки зрения концепции программирования ближайший к Lua язык - это JavaScript:

  • Lua имеет не типов переменных. Переменная может принимать любое значение.
  • Lua не требуется явное объявление переменных. Если переменной не присвоено значение, она будет иметь значение nil.
  • Интерфейс классов Lua (известный как таблицы) создается динамически путем присвоения ссылки на функцию.

Таблицы

Концепция таблиц - наиболее сложная для новичков Lua. Таблицы - это всё в Lua: это классы, хеш-таблицы (словари) и даже массивы.

Таблица как хеш-таблица.

Можно хранить и затем извлечь значение внутри таблицы с помощью любого ключа:

 -- create a table
 a = {};
 -- put value 123 into the table with key "onetwothree"
 a["onetwothree"] = 123;
 -- retrieve the value by the key
 print(a["onetwothree"]);

Если ключ является строкой, можно использовать оператор точка (.) для присвоения или извлечения значения. Пример ниже выполняет точно то же самое, что и предыдущий пример:

 -- create a table
 a = {};
 -- put value 123 into the table with key "onetwothree"
 a.onetwothree = 123;
 -- retrieve the value by the key
 print(a.onetwothree);

Вы также можете смешивать синтаксис. Например, этот код тоже правильный и делает то же самое:

 -- create a table
 a = {};
 -- put value 123 into the table with key "onetwothree"
 a.onetwothree = 123;
 -- retrieve the value by the key
 print(a["onetwothree"]);

Таблица как массив.

Если вы используете целое число как ключ, и значения будут присвоены, начиная с ключа 1, последовательно, по порядку без пробелов, то Lua (и LuaJIT) оптимизатор узнаёт эту часть значений как массив. В этом случае используется метод альтернативного (и действительно более быстрого) доступа:

 local array, i;
 -- create a table
 array = {};
 -- fill the table
 for i = 1, 10, 1 do 
    array[i] = i * 20;
 end
 -- now keys 1 to 10 are stored as an array
 -- but we are still able to add additional properties to the dictionary part of the table
 array.first_item = 1;
 array.last_item = 10;
 -- this (access to the array part)...
 b = a[5];
 -- ...is faster than this (access to the dictionary part)
 c = a.first_item;

Таблицы как класс

Ссылка на функцию может также храниться в таблице.

 -- create a table
 math = {};
 -- create an inline function and store the reference into the table 
 math.abs = function (x) 
              if x < 0 then
                 return -x;
              else
                 return x;
              end;
            end
 ...
 b = math.abs(-10);

Выглядит точно так же, как статический метод класса, не так ли? А что если мы хотим создать методы объекта? Методы объекта должны получить ссылку в таблице, не так ли? Давайте посмотрим.

 -- create a table
 mytable = {};
 -- create a property
 mytable.x = 0;
 -- create a method
 mytable.inc = function (_this) 
                   _this.x = _this.x + 1;
               end

Теперь мы можем использовать так:

  mytable.inc(mytable);

Однако другие языки (за исключением простого C) не требуют явной передачи ссылки! Почему Lua это делает? Ну, для такого случая Lua имеет «синтаксис сахара», двоеточие (:), так что показанный выше вызов может быть написан так:

  mytable:inc();

Где Находится Документация?

  • Стандартная документация Lua включена в онлайн и офлайн версии документации Indicore SDK.
  • Можно всегда обратиться на официальный веб-сайт Lua: http://www.lua.org.

Какая Версия Lua Используется?

Indicore использует спецификацию Lua 5.1.4 и реализацию виртуальной машины LuaJIT 2.0.

Совместим ли Indicore с Расширениями Lua Сторонних Разработчиков?

Да. Однако, как указывалось выше, мы используем LuaJIT 2.0 вместо той первоначальной виртуальной машины Lua, которая буквально является API/ABI совместимой с исходной реализацией Lua VM за исключением способности сохранять или загружать Lua байт код. LuaJIT 2.0 имеет свой собственный компилятор, который не совместим с первоначальной VM Lua.

Так что просто проверьте, совместимо ли расширение с LuaJIT.

Эта Статья на Других Языках

Language: English  • español • français • русский • 中文 • 中文(繁體)‎