Lua 教學
 

Lua 是一種相當普遍使用的內嵌式語言,很適合配合使用其它程式語言(例如 C 或 C++)所寫的程式。例如,遊戲可以利用 Lua 來描述其場景的行為(比如說,當玩家打開某個箱子時,會發生什麼事)。這樣可以把場景的描述和遊戲程式本身分開,而且也讓一般對程式語言不熟悉的人更容易去設計遊戲的場景。

因為 Lua 的主要目的之一是要讓對程式設計不熟悉的人也能使用,因此它的設計相當單純,適合一般人學習。這篇文章就是針對一般的、沒有程式設計背景的人所寫的。

Lua 是由巴西里約熱內盧天主教大學(PUC-Rio)的 Roberto Ierusalimschy、Luiz Henrique de Figueiredo、和 Waldemar Celes 在 1993 年開發出來的,到現在已經發展至第五版。

安裝 Lua

如果你的系統上並沒有安裝 Lua,可以請熟悉的朋友幫你安裝。Lua 是一個開放原始碼的程式,而且免費提供給任何用途(包括商業和非商業用途),原始碼可以從 Lua 的網站下載。這裡也提供一個可以在 Windows 下執行的 Lua(使用 Visual C++ 2005 編譯),可以從這裡下載

如果使用本站提供的 Lua 版本,則其執行檔會在 bin 目錄中(例如,如果將檔案解壓縮至 C:\lua 目錄中,則執行檔會在 C:\lua\bin 裡面)。在 x64 目錄裡面有 64 bits 版的執行檔,提供給 64 bits Windows 的使用者使用(64 bits Windows 的使用者仍可以執行一般 32 bits 版本的執行檔)。

Hello, world!

Lua 提供了一個「互動式」的模式,可以讓使用者快速測試一些東西,也適合用來學習 Lua。要使用這個互動式的模式,只要直接執行 lua 即可。以 Windows 系統為例:

C:\lua\bin> lua
Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio
>

這時就可以開始輸入 Lua 的程式了。我們先以一個最簡單也最傳統的例子:顯示 Hello, world!:

print("Hello, world!")

輸入上面這行指令,並按下 enter 鍵之後,Lua 應該會印出 Hello, world!。

print 是一個 Lua 內建的「函數」(function)。它的功能,就是把它的「參數」(parameter)印出來。函數的參數會用括號 ( ) 括起來。在上面的例子中,"Hello, world!" 就是它的參數。"Hello, world!" 是一個「字串」(string),也就是我們想要印出來的東西。在 Lua 裡面,任何以雙引號 ( " ) 或是單引號 ( ' ) 括住的字都是字串。例如,我們也可以寫:

print('Hello, world!')

也會有同樣的效果。

除了字串以外,一般的程式中最常用的大概就是數字了。同樣的,我們也可以使用 print 函數把數字印出來:

print(100)

它會直接印出 100。

當然,數字可以進行一些運算。Lua 支援標準的加、減、乘、除、負號、和指數運算。要注意的是,在程式語言中,乘法通常是使用星號 ( * ) 表示,而除法則是用斜線 ( / ) 表示,Lua 也不例外。Lua 使用 ^ (鍵盤上 6 上面的符號)來表示指數運算。Lua 的運算方式和一般數學上的運算方式是一樣的(例如先乘除後加減等等)。以下是一個例子:

print(1+1)

會印出 2。更多的例子:

> print(1+2^3*5)
41
> print(1/2)
0.5

變數

到目前為止,我們只把 Lua 當成一個比較複雜一點的計算機而已。當然它的功能不只是這樣而已。這裡要介紹一個觀念,稱為「變數」(variable)。在程式語言中,所謂的「變數」是指一個存放某些資料的地方,用一個名字來表示。以下是一個例子:

> i = 100
> print(i)
100

第一行的 i = 100 表示我們把變數 i 指定一個值,也就是 100。因此,第二行的 print(i) 會把 i 的值印出來,因此它會印出 100。

到目前為止,這似乎沒有什麼特別有趣的地方。不過,「變數」之所以叫「變數」就是因為它的內容是可以修改的:

> i = 200
> print(i)
200
> i = i + 1
> print(i)
201

我們可以把 i 重新指定一個值 200。後面的 i = i + 1 看起來似乎有點奇怪,不過它的意思是說,把 i + 1 的結果指定給 i。因此,i 原本是 200,在執行過 i = i + 1 之後,就會變成 201 了。

變數的值不一定要是一個數字,它也可以是字串。例如:

> i = "Hello, world!"
> print(i)
Hello, world!

在 Lua 中,如果一個字串的內容是一個數字,則它可以像數字一樣進行運算。例如:

> i = "5" + 3
> print(i)
8

不過,如果是其它的字串,例如 "Hello, world!",把它和數字進行運算,就會產生錯誤訊息。然而,字串也有自己的「運算」。在 Lua 中,可以用 .. (兩個句點)把兩個字串連接起來:

> i = "Hello, "
> j = "world!"
> print(i .. j)
Hello, world!

在這種情形下,我們也可以把數字和字串連接起來,此時數字會自動被轉換成字串:

> print("1+1=" .. 1+1)
1+1=2

在上面的例子中,1+1 先計算出結果 2,然後再和 "1+1=" 這個字串連接起來,因此會得到 "1+1=2" 這個字串。

執行程式

使用互動式的模式來操作 Lua 是很有趣的,但是它不能把輸入的程式保留下來。如果每次要使用某個程式,就要重新輸入一次,就太不方便了。因此,我們也可以把程式儲存成一個檔案,再讓 Lua 去執行。例如,可以用文字編輯器建立一個檔案 hello.lua,內容是:

print("Hello, world!")

然後,執行 Lua,但是加上 hello.lua 作為參數:

C:\lua\bin>lua hello.lua

它會讀取並執行 hello.lua 的內容,也就是印出 Hello, world!,然後結束。如果你還在之前的 Lua 互動式模式裡面的話,可以輸入 os.exit() 結束互動式模式的執行(os.exit() 是一個 Lua 內建的系統函數,它會立刻結束程式的執行)。

我們現在要來寫一個比較有用的程式。這個程式會讀取兩個數字,然後印出這兩個數字的和。建立一個檔案 adder.lua,如下:

io.write("Input A: ")
a = io.read()
io.write("Input B: ")
b = io.read()
io.write("A + B = " .. a+b .. "\n")

這個程式看起來好像有很多新東西,但是其實並不難。

io.write 是一個 Lua 內建的函數,它的功能和 print 非常相似,也是把參數印出來。不過,它有一點不同的地方是,它並不會自動換行。

io.read() 則會讀取鍵盤輸入的內容。因此,a = io.read() 會等使用者輸入一行字,然後把使用者輸入的內容存到 a 裡面。

因此,這個程式的執行過程是:它先印出 Input A: 並等使用者輸入,再印出 Input B: 再等使用者輸入。最後,它把 a + b 的結果印出來。最後一行的字串中最後面的 "\n" 是換行的符號,這是因為 io.write 並不會自動換行,所以把它加在後面才會換行。當然,這裡也可以用 print 函數,因為 print 函數本來就會換行。

要注意的是,io.read 函式傳回的值是字串。所以 a = io.read() 讀到的 a,是一個字串,而不是數字。我們在這裡是利用到了前面提到的,內容是數字的字串,在進行運算時,會自動暫時轉換成數字的這個性質。因此,如果使用者輸入的並不是數字(比如說,他在 Input A: 時輸入 Hello, world!),那麼在執行到 a+b 的時候,就會產生錯誤訊息了。