Lua/zh-hant
Contents
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 • русский • 中文 • 中文(繁體) |
---|