Ⅰ Lua程序設計的圖書目錄
第1部分
第1章 開始 3
1.1 程序塊(chunk) 3
1.2 詞法規范 5
1.3 全局變數 6
1.4 解釋器程序(the dtand-slone interpreter) 7
第2章 類型與值 9
2.1 nil(空) 10
2.2 boolean(布爾) 10
2.3 number(數字) 10
2.4 string(字元串) 11
2.5 table(表) 14
2.6 function(函數) 17
2.7 userdata(自定義類型)和thread(線程) 18
第3章 表達式 19
3.1 算術操作符 19
3.2 關系操作符 20
3.3 邏輯操作符 20
3.4 字元串連接 22
3.5 優先順序 22
3.6 table構造式(table constructor) 23
第4章 語句 27
4.1 賦值 27
4.2 局部變數與塊(block) 28
4.3 控制結構 30
4.3.1 if then else 30
4.3.2 while 31
4.3.3 repeat 31
4.3.4 數字型for(numeric for) 31
4.3.5 泛型for(generic for) 32
4.4 break與return 34
第5章 函數 35
5.1 多重返回值(multiple results) 36
5.2 變長參數(variable number of arguments) 39
5.3 具名實參(named arguments) 42
第6章 深入函數 45
6.1 closure(閉合函數) 47
6.2 非全局的函數(non-global function) 50
6.3 正確的尾調用(proper tail call) 52
第7章 迭代器與泛型for 55
7.1 迭代器與closure 55
7.2 泛型for的語義 57
7.3 無狀態的迭代器 58
7.4 具有復雜狀態的迭代器 60
7.5 真正的迭代器 61
第8章 編譯、執行與錯誤 63
8.1 編譯 63
8.2 C代碼 66
8.3 錯誤(error) 67
8.4 錯誤處理與異常 69
8.5 錯誤消息與追溯(traceback) 70
第9章 協同程序(coroutine) 73
9.1 協同程序基礎 73
9.2 管道(pipe)與過濾器(filter) 76
9.3 以協同程序實現迭代器 78
9.4 非搶先式的(non-preemptive)多線程 81
第10章 完整的示例 87
10.1 數據描述 87
10.2 馬爾可夫鏈(markov chain)演算法 90
第2部分
第11章 數據結構 95
11.1 數組 95
11.2 矩陣與多維數組 96
11.3 鏈表 97
11.4 隊列與雙向隊列 98
11.5 集合與無序組(bag) 99
11.6 字元串緩沖 100
11.7 圖 102
第12章 數據文件與持久性 105
12.1 數據文件 105
12.2 串列化(Serialization) 107
12.2.1 保存無環的table 109
12.2.2 保存有環的table 110
第13章 元表(metatable)與元方法(meatmethod) 113
13.1 算術類的元方法 114
13.2 關系類的元方法 116
13.3 庫定義的元方法 117
13.4 table訪問的元方法 118
13.4.1 _ _index元方法 118
13.4.2 _ _newindex元方法 120
13.4.3 具有默認值的table 120
13.4.4 跟蹤table的訪問 121
13.4.5 只讀的table 123
第14章 環境 125
14.1 具有動態名字的全局變數 125
14.2 全局變數聲明 127
14.3 非全局的環境 129
第15章 模塊與包 133
15.1 require函數 134
15.2 編寫模塊的基本方法 136
15.3 使用環境 138
15.4 mole函數 140
15.5 子模塊與包 141
第16章 面向對象編程 143
16.1 類 144
16.2 繼承 146
16.3 多重繼承 148
16.4 私密性 150
16.5 單一方法(single-method)做法 152
第17章 弱引用table 153
17.1 備忘錄(memoize)函數 154
17.2 對象屬性 156
17.3 回顧table的默認值 157
第3部分
第18章 數學庫 161
第19章 table庫 163
第20章 字元串庫 167
第21章 I/O庫 185
第22章 操作系統庫 193
第23章 調試庫 197
第4部分
……
Ⅱ lua程序設計一共有兩本書,第一版和第二版,看過的人能不能告訴那個版本好
第一版的內容在第二版中都保留了 建議看新版 現在第三版都出了
Ⅲ 求《Lua程序設計(第2版)》中文版 電子書
lua程序設計電子書chm[炫彩版2009-2-12更新]
http://bbs.luaer.cn/read-Lua-tid-172.html
翻譯由www.luachina.net完成的,並且已經徵得作者Mr.RobertoIerusalimschy的同意,LZ注冊一下下載,也是對人家的認可……
PS:也有PDF的,自己搜索吧
Ⅳ lua腳本應該怎麼學
我是這樣學的:先把lua手冊看一遍,了解語法。然後再下一份lua程序設計電子書看看。最後拿例子實踐,例子從簡單到復雜,循序漸進,學習東西要有耐心。希望對你有幫助
Ⅳ LUA語言入門
LUA腳本語言入門(純粹轉帖,僅供參考)
Lua 程序設計初步
作者: 沐楓 (第二人生成員)
版權所有轉載請註明原出處
在這篇文章中,我想向大家介紹如何進行Lua程序設計。我假設大家都學過至少一門編程語言,比如Basic或C,特別是C。因為Lua的最大用途是在宿主程序中作為腳本使用的。
Lua 的語法比較簡單,學習起來也比較省力,但功能卻並不弱。
在Lua中,一切都是變數,除了關鍵字。請記住這句話。
I. 首先是注釋
寫一個程序,總是少不了注釋的。
在Lua中,你可以使用單行注釋和多行注釋。
單行注釋中,連續兩個減號"--"表示注釋的開始,一直延續到行末為止。相當於C++語言中的"//"。
多行注釋中,由"--[["表示注釋開始,並且一直延續到"]]"為止。這種注釋相當於C語言中的"/*…*/"。在注釋當中,"[["和"]]"是可以嵌套的。
II. Lua編程
經典的"Hello world"的程序總是被用來開始介紹一種語言。在Lua中,寫一個這樣的程序很簡單:
print("Hello world")
在Lua中,語句之間可以用分號";"隔開,也可以用空白隔開。一般來說,如果多個語句寫在同一行的話,建議總是用分號隔開。
Lua 有好幾種程序控制語句,如:
條件控制:if 條件 then … elseif 條件 then … else … end
While循環:while 條件 do … end
Repeat循環:repeat … until 條件
For循環:for 變數 = 初值,終點值,步進 do … end
For循環:for 變數1,變數2,… ,變數N in表或枚舉函數 do … end
注意一下,for的循環變數總是只作用於for的局部變數,你也可以省略步進值,這時候,for循環會使用1作為步進值。
你可以用break來中止一個循環。
如果你有程序設計的基礎,比如你學過Basic,C之類的,你會覺得Lua也不難。但Lua有幾個地方是明顯不同於這些程序設計語言的,所以請特別注意。
.語句塊
語句塊在C++中是用"{"和"}"括起來的,在Lua中,它是用do 和 end 括起來的。比如:
do print("Hello") end
你可以在 函數 中和 語句塊 中定局部變數。
.賦值語句
賦值語句在Lua被強化了。它可以同時給多個變數賦值。
例如:
a,b,c,d=1,2,3,4
甚至是:
a,b=b,a -- 多麼方便的交換變數功能啊。
在默認情況下,變數總是認為是全局的。假如你要定義局部變數,則在第一次賦值的時候,需要用local說明。比如:
local a,b,c = 1,2,3 -- a,b,c都是局部變數
.數值運算
和C語言一樣,支持 +, -, *, /。但Lua還多了一個"^"。這表示指數乘方運算。比如2^3 結果為8, 2^4結果為16。
連接兩個字元串,可以用".."運處符。如:
"This a " .. "string." -- 等於 "this a string"
.比較運算
< > <= >= == ~=
分別表示 小於,大於,不大於,不小於,相等,不相等
所有這些操作符總是返回true或false。
對於Table,Function和Userdata類型的數據,只有 == 和 ~=可以用。相等表示兩個變數引用的是同一個數據。比如:
a={1,2}
b=a
print(a==b, a~=b) -- true, false
a={1,2}
b={1,2}
print(a==b, a~=b) -- false, true
.邏輯運算
and, or, not
其中,and 和 or 與C語言區別特別大。
在這里,請先記住,在Lua中,只有false和nil才計算為false,其它任何數據都計算為true,0也是true!
and 和 or的運算結果不是true和false,而是和它的兩個操作數相關。
a and b:如果a為false,則返回a;否則返回b
a or b:如果 a 為true,則返回a;否則返回b
舉幾個例子:
print(4 and 5) --> 5
print(nil and 13) --> nil
print(false and 13) --> false
print(4 or 5) --> 4
print(false or 5) --> 5
在Lua中這是很有用的特性,也是比較令人混洧的特性。
我們可以模擬C語言中的語句:x = a? b : c,在Lua中,可以寫成:x = a and b or c。
最有用的語句是: x = x or v,它相當於:if not x then x = v end 。
.運算符優先順序,從高到低順序如下:
^
not - (一元運算)
* / + -
..(字元串連接)
< > <= >= ~= ==
and
or
III. 關鍵字
關鍵字是不能做為變數的。Lua的關鍵字不多,就以下幾個:
and break do else elseif
end false for function if
in local nil not or
repeat return then true until while
IV. 變數類型
怎麼確定一個變數是什麼類型的呢?大家可以用type()函數來檢查。Lua支持的類型有以下幾種:
Nil 空值,所有沒有使用過的變數,都是nil。nil既是值,又是類型。
Boolean 布爾值
Number 數值,在Lua里,數值相當於C語言的double
String 字元串,如果你願意的話,字元串是可以包含'\0'字元的
Table 關系表類型,這個類型功能比較強大,我們在後面慢慢說。
Function 函數類型,不要懷疑,函數也是一種類型,也就是說,所有的函數,它本身就是一個變數。
Userdata 嗯,這個類型專門用來和Lua的宿主打交道的。宿主通常是用C和C++來編寫的,在這種情況下,Userdata可以是宿主的任意數據類型,常用的有Struct和指針。
Thread 線程類型,在Lua中沒有真正的線程。Lua中可以將一個函數分成幾部份運行。如果感興趣的話,可以去看看Lua的文檔。
V. 變數的定義
所有的語言,都要用到變數。在Lua中,不管你在什麼地方使用變數,都不需要聲明,並且所有的這些變數總是全局變數,除非,你在前面加上"local"。
這一點要特別注意,因為你可能想在函數里使用局部變數,卻忘了用local來說明。
至於變數名字,它是大小寫相關的。也就是說,A和a是兩個不同的變數。
定義一個變數的方法就是賦值。"="操作就是用來賦值的
我們一起來定義幾種常用類型的變數吧。
A. Nil
正如前面所說的,沒有使用過的變數的值,都是Nil。有時候我們也需要將一個變數清除,這時候,我們可以直接給變數賦以nil值。如:
var1=nil -- 請注意 nil 一定要小寫
B. Boolean
布爾值通常是用在進行條件判斷的時候。布爾值有兩種:true 和 false。在Lua中,只有false和nil才被計算為false,而所有任何其它類型的值,都是true。比如0,空串等等,都是true。不要被 C語言的習慣所誤導,0在Lua中的的確確是true。你也可以直接給一個變數賦以Boolean類型的值,如:
varboolean = true
C. Number
在Lua中,是沒有整數類型的,也不需要。一般情況下,只要數值不是很大(比如不超過100,000,000,000,000),是不會產生舍入誤差的。在很多CPU上,實數的運算並不比整數慢。
實數的表示方法,同C語言類似,如:
4 0.4 4.57e-3 0.3e12 5e+20
D. String
字元串,總是一種非常常用的高級類型。在Lua中,你可以非常方便的定義很長很長的字元串。
字元串在Lua中有幾種方法來表示,最通用的方法,是用雙引號或單引號來括起一個字元串的,如:
"This is a string."
和C語言相同的,它支持一些轉義字元,列表如下:
\a bell
\b back space
\f form feed
\n newline
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\" double quote
\' single quote
\[ left square bracket
\] right square bracket
由於這種字元串只能寫在一行中,因此,不可避免的要用到轉義字元。加入了轉義字元的串,看起來實在是不敢恭維,比如:
"one line\nnext line\n\"in quotes\", 'in quotes'"
一大堆的"\"符號讓人看起來很倒胃口。如果你與我有同感,那麼,我們在Lua中,可以用另一種表示方法:用"[["和"]]"將多行的字元串括起來,如:
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
<A HREF="http://www.lua.org">Lua</A>
[[a text between double brackets]]
</BODY>
</HTML>
]]
值得注意的是,在這種字元串中,如果含有單獨使用的"[["或"]]"就仍然得用"\["或"\]"來避免歧義。當然,這種情況是極少會發生的。
E. Table
關系表類型,這是一個很強大的類型。我們可以把這個類型看作是一個數組。只是C語言的數組,只能用正整數來作索引;在Lua中,你可以用任意類型來作數組的索引,除了nil。同樣,在C語言中,數組的內容只允許一種類型;在Lua中,你也可以用任意類型的值來作數組的內容,除了nil。
Table的定義很簡單,它的主要特徵是用"{"和"}"來括起一系列數據元素的。比如:
T1 = {} -- 定義一個空表
T1[1]=10 -- 然後我們就可以象C語言一樣來使用它了。
T1["John"]={Age=27, Gender="Male"}
這一句相當於:
T1["John"]={} -- 必須先定義成一個表,還記得未定義的變數是nil類型嗎
T1["John"]["Age"]=27
T1["John"]["Gender"]="Male"
當表的索引是字元串的時候,我們可以簡寫成:
T1.John={}
T1.John.Age=27
T1.John.Gender="Male"
或
T1.John{Age=27, Gender="Male"}
這是一個很強的特性。
在定義表的時候,我們可以把所有的數據內容一起寫在"{"和"}"之間,這樣子是非常方便,而且很好看。比如,前面的T1的定義,我們可以這么寫:
T1=
{
10, -- 相當於 [1] = 10
[100] = 40,
John= -- 如果你原意,你還可以寫成:["John"] =
{
Age=27, -- 如果你原意,你還可以寫成:["Age"] =27
Gender=Male -- 如果你原意,你還可以寫成:["Gender"] =Male
},
20 -- 相當於 [2] = 20
}
看起來很漂亮,不是嗎?我們在寫的時候,需要注意三點:
第一,所有元素之間,總是用逗號","隔開;
第二,所有索引值都需要用"["和"]"括起來;如果是字元串,還可以去掉引號和中括弧;
第三,如果不寫索引,則索引就會被認為是數字,並按順序自動從1往後編;
表類型的構造是如此的方便,以致於常常被人用來代替配置文件。是的,不用懷疑,它比ini文件要漂亮,並且強大的多。
F. Function
函數,在Lua中,函數的定義也很簡單。典型的定義如下:
function add(a,b) -- add 是函數名字,a和b是參數名字
return a+b -- return 用來返回函數的運行結果
end
請注意,return語言一定要寫在end之前。假如你非要在中間放上一句return,那麼請寫成:do return end。
還記得前面說過,函數也是變數類型嗎?上面的函數定義,其實相當於:
add = function (a,b) return a+b end
當你重新給add賦值時,它就不再表示這個函數了。你甚至可以賦給add任意數據,包括nil (這樣,你就清除了add變數)。Function是不是很象C語言的函數指針呢?
和C語言一樣,Lua的函數可以接受可變參數個數,它同樣是用"…"來定義的,比如:
function sum (a,b,…)
如果想取得…所代表的參數,可以在函數中訪問arg局部變數(表類型)得到。
如 sum(1,2,3,4)
則,在函數中,a = 1, b = 2, arg = {3, 4}
更可貴的是,它可以同時返回多個結果,比如:
function s()
return 1,2,3,4
end
a,b,c,d = s() -- 此時,a = 1, b = 2, c = 3, d = 4
前面說過,表類型可以擁有任意類型的值,包括函數!因此,有一個很強大的特性是,擁有函數的表,哦,我想更恰當的應該說是對象吧。Lua可以使用面向對象編程了。不信?那我舉例如下:
t =
{
Age = 27
add = function(self, n) self.Age = self.Age+n end
}
print(t.Age) -- 27
t.add(t, 10)
print(t.Age) -- 37
不過,t.add(t,10) 這一句實在是有點土對吧?沒關系,在Lua中,你可以簡寫成:
t:add(10) -- 相當於 t.add(t,10)
G. Userdata 和 Thread
這兩個類型的話題,超出了本文的內容,就不打算細說了。
VI. 結束語
就這么結束了嗎?當然不是,接下來,需要用Lua解釋器,來幫助你理解和實踐了。這篇小文只是幫助你大體了解Lua的語法。如果你有編程基礎,相信會很快對Lua上手了。
就象C語言一樣,Lua提供了相當多的標准函數來增強語言的功能。使用這些標准函數,你可以很方便的操作各種數據類型,並處理輸入輸出。有關這方面的信息,你可以參考《Programming in Lua 》一書,你可以在網路上直接觀看電子版,網址為:http://www.lua.org/pil/index.html
使用常式
1. 函數的使用
以下程序演示了如何在Lua中使用函數, 及局部變數
例e02.lua
-- functions
function pythagorean(a, b)
local c2 = a^2 + b^2
return sqrt(c2)
end
print(pythagorean(3,4))
運行結果
5
程序說明
在Lua中函數的定義格式為:
function 函數名(參數)
...
end
與Pascal語言不同, end不需要與begin配對, 只需要在函數結束後打個end就可以了.
本例函數的作用是已知直角三角形直角邊, 求斜邊長度. 參數a,b分別表示直角邊長,
在函數內定義了local形變數用於存儲斜邊的平方. 與C語言相同, 定義在函數內的代
碼不會被直接執行, 只有主程序調用時才會被執行.
local表示定義一個局部變數, 如果不加local剛表示c2為一個全局變數, local的作用域
是在最里層的end和其配對的關鍵字之間, 如if ... end, while ... end等。全局變數的
作用域是整個程序。
2. 循環語句
例e03.lua
-- Loops
for i=1,5 do
print("i is now " .. i)
end
運行結果
i is now 1
i is now 2
i is now 3
i is now 4
i is now 5
程序說明
這里偶們用到了for語句
for 變數 = 參數1, 參數2, 參數3 do
循環體
end
變數將以參數3為步長, 由參數1變化到參數2
例如:
for i=1,f(x) do print(i) end
for i=10,1,-1 do print(i) end
這里print("i is now " .. i)中,偶們用到了..,這是用來連接兩個字元串的,
偶在(1)的試試看中提到的,不知道你們答對了沒有。
雖然這里i是一個整型量,Lua在處理的時候會自動轉成字元串型,不需偶們費心。
3. 條件分支語句
例e04.lua
-- Loops and conditionals
for i=1,5 do
print(「i is now 「 .. i)
if i < 2 then
print(「small」)
elseif i < 4 then
print(「medium」)
else
print(「big」)
end
end
運行結果
i is now 1
small
i is now 2
medium
i is now 3
medium
i is now 4
big
i is now 5
big
程序說明
if else用法比較簡單, 類似於C語言, 不過此處需要注意的是整個if只需要一個end,
哪怕用了多個elseif, 也是一個end.
例如
if op == "+" then
r = a + b
elseif op == "-" then
r = a - b
elseif op == "*" then
r = a*b
elseif op == "/" then
r = a/b
else
error("invalid operation")
end
數組的使用
1.簡介
Lua語言只有一種基本數據結構, 那就是table, 所有其他數據結構如數組啦,
類啦, 都可以由table實現.
2.table的下標
例e05.lua
-- Arrays
myData = {}
myData[0] = 「foo」
myData[1] = 42
-- Hash tables
myData[「bar」] = 「baz」
-- Iterate through the
-- structure
for key, value in myData do
print(key .. 「=「 .. value)
end
輸出結果
0=foo
1=42
bar=baz
程序說明
首先定義了一個table myData={}, 然後用數字作為下標賦了兩個值給它. 這種
定義方法類似於C中的數組, 但與數組不同的是, 每個數組元素不需要為相同類型,
就像本例中一個為整型, 一個為字元串.
程序第二部分, 以字元串做為下標, 又向table內增加了一個元素. 這種table非常
像STL裡面的map. table下標可以為Lua所支持的任意基本類型, 除了nil值以外.
Lua對Table佔用內存的處理是自動的, 如下面這段代碼
a = {}
a["x"] = 10
b = a -- `b' refers to the same table as `a'
print(b["x"]) --> 10
b["x"] = 20
print(a["x"]) --> 20
a = nil -- now only `b' still refers to the table
b = nil -- now there are no references left to the table
b和a都指向相同的table, 只佔用一塊內存, 當執行到a = nil時, b仍然指向table,
而當執行到b=nil時, 因為沒有指向table的變數了, 所以Lua會自動釋放table所佔內存
3.Table的嵌套
Table的使用還可以嵌套,如下例
例e06.lua
-- Table 『constructor』
myPolygon = {
color=「blue」,
thickness=2,
npoints=4;
{x=0, y=0},
{x=-10, y=0},
{x=-5, y=4},
{x=0, y=4}
}
-- Print the color
print(myPolygon[「color」])
-- Print it again using dot
-- notation
print(myPolygon.color)
-- The points are accessible
-- in myPolygon[1] to myPolygon[4]
-- Print the second point』s x
-- coordinate
print(myPolygon[2].x)
程序說明
首先建立一個table, 與上一例不同的是,在table的constructor裡面有{x=0,y=0},
這是什麼意思呢? 這其實就是一個小table, 定義在了大table之內, 小table的
table名省略了.
最後一行myPolygon[2].x,就是大table裡面小table的訪問方式.