Lua/zh-hant

From FxCodeBaseWiki
Jump to: navigation, search

Lua

什麼是 Lua?

Lua 是一種極為快速、簡單和強大的指令碼語言。 它由巴西里約熱內盧天主教大學 (PUC-Rio) 的研究人員設計、實施和維護。在許多對時間要求很高的應用程式中,Lua 的優勢已得到充分證明,這些應用程式包括「魔獸世界」等即時戰略遊戲。如今,Lua 已成為世界上最流行的前 20 種程式設計語言之一。

Lua 官方網站:http://www.lua.org

Lua 有什麼特徵?

語法

就語法而言,Lua 接近於 Pascal 系列程式設計語言 (Pascal、ADA、Delphi)。與 C++ 不同,Lua 中沒有如下語法糖:作為運算式一部分的首碼/尾碼運算符或賦值。

比較以 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 初學者來說,表概念是最複雜的概念。在 Lua 中,表就是一切 - 它們是類別、雜湊表(字典),甚至是陣列。

用作雜湊表的表。

您可以使用任意的鍵在表內儲存值並在隨後進行擷取:

 -- 建立表
 a = {};
 -- 使用鍵「onetwothree」將值 123 存入表中
 a["onetwothree"] = 123;
 -- 透過鍵擷取值
 print(a["onetwothree"]);

如果鍵是字串,可使用點運算符 (.) 來賦值或擷取值。下面的 示例與前面的示例執行的操作完全相同:

 -- 建立表
 a = {};
 -- 使用鍵「onetwothree」將值 123 存入表中
 a.onetwothree = 123;
 -- 透過鍵擷取值
 print(a.onetwothree);

您也可以混用語法。例如,下面的程式碼也是正確的,並執行相同的操作:

 -- 建立表
 a = {};
 -- 使用鍵「onetwothree」將值 123 存入表中
 a.onetwothree = 123;
 -- 透過鍵擷取值
 print(a["onetwothree"]);

用作陣列的表。

如果使用整數作為鍵,並且從鍵 1 開始依次賦值,其中沒有間隔,Lua(和 LuaJIT)優化器會將這部分賦值識別為陣列。在這種情況下,會使用另一種速度更快的替代存取方法:

 local array, i;
 -- 建立表
 array = {};
 -- 填充表
 for i = 1, 10, 1 do 
    array[i] = i * 20;
 end
 -- 現在,鍵 1 到 10 儲存為陣列
 -- 但我們仍可以將其他屬性添加到表的字典部分
 array.first_item = 1;
 array.last_item = 10;
 -- 這種方法(存取陣列部分)...
 b = a[5];
 -- ...比這種方法(存取字典部分)更快
 c = a.first_item;

用作類別的表。

對函數的引用也可以儲存在表中。

 -- 建立表
 math = {};
 -- 建立內聯函數並將其引用資訊儲存到表中 
 math.abs = function (x) 
              if x < 0 then
                 return -x;
              else
                 return x;
              end;
            end
 ...
 b = math.abs(-10);

看上去是不是就像類別的靜態方法?現在,如果我們要建立執行個體方法,會怎樣呢?執行個體方法必須收到對表的引用,不是嗎?讓我們來看看。

 -- 建立表
 mytable = {};
 -- 建立屬性
 mytable.x = 0;
 -- 建立方法
 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 與第 3 方 Lua 擴展程式相容嗎?

相容。但如上所述,我們使用 LuaJIT 2.0 而不是原始的 Lua 虛擬機,它在應用程式介面和應用程式二進位介面 (API/ABI) 方面基本與原始 Lua 虛擬機相容,只是無法儲存或載入 Lua 位元組碼。LuaJIT 2.0 有自己的編譯器,該編譯器與原始 Lua 虛擬機不相容。

因此,請檢查擴展程式是否與 LuaJIT 相容。

其他語言版本

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