標籤:
Lua學習指南:http://www.lua.org/manual/
首先我們要明確的一點是:在Lua中,除了關鍵字外一切都是變數。
Lua關鍵字
可以查看這個地址:http://www.lua.org/manual/5.1/manual.html#2.1
關於分號
語句的最後可以用分號";"表示結束,也可以不寫。
而對於一行有多個語句的情況下,語句之間可以用分號";"隔開,也可以用空白隔開。一般來說,建議總是用分號隔開。
使用注釋
單行注釋使用“--”即可,以後的內容都會被當做注釋;
多行注釋以“--[[”開始,以“]]”結束。
變數聲明
由於是動態類型,所以變數聲明時不需要宣告類型,但是一定要進行賦值,如果希望是空類型,可以賦值nil,如下:
1 num = 100--數字1002 str = "abc"--字串abc3 obj = nil--空類型
注意在Lua中所有的變數和關鍵字都是大小寫敏感的。
賦值
可以一次對多個變數賦值,規則:如果等號(“=”)右邊多了,則捨棄,左邊多了,則賦值為空白(nil) 。
運算式 a,b=b,a表示a和b的值交換,類型不一樣照樣可以交換。
1 a, b, c = 100, "abc"2 print(a, b, c)--100 abc nil3 4 a, b = b, a5 print(a, b, c)--abc 100 nil
類型
我們看看Lua內建的基礎資料型別 (Elementary Data Type)都有哪些:
- nil:表示變數還沒有被賦值,可以看做刪除該變數的意思;
- Boolean:布爾類型,true和false;
- number:數字類型,內部以double表示;
- string:字串,總是以零結尾,但可以包含任一字元(包括零),因此並不等價於C字串,而是其超集;
- table:表,實際是一個關聯陣列,索引可以使用數字或字串,不同於其他語言的數組把0作為數組的初始索引,在Lua裡表的預設初始索引一般以1開始。table的變數只是一個地址引用,對table的操作不會產生table的副本或建立新的table,table不會固定長度大小,有新資料添加時table長度會自動成長,沒初始的table都是nil;
- function:函數,可以作為匿名函數來使用;
- userdata:使用者(非指令碼使用者)定義的C資料結構,指令碼使用者只能使用它,不能定義;
- thread:Lua協作線程(coroutine),與一般作業系統的搶佔式線程不一樣;
接下來的筆記會著重介紹這些核心的基礎資料型別 (Elementary Data Type)。
而判斷變數究竟是什麼類型依靠的是他的值,我們看看下面的例子:
1 num = 100 2 str = "abc" 3 obj = nil 4 func = print 5 6 print(type(num))--number 7 print(type(str))--string 8 print(type(obj))--nil 9 print(type(func))--function10 11 func = str12 13 print(type(func))--string
全域和局部
預設聲明的變數都是全域變數,表示可以在全域範圍內進行訪問,而局部變數則是在聲明之前添加local關鍵字,如下:
1 local num2 local str = "abc"3 4 print(num)--nil5 print(str)--abc
全域變數聲明時必須賦值,而局部變數則不需要。
塊
do...end可以聲明一個程式塊,局部變數的生命週期在自己的程式塊和子程式塊中:
1 function main() 2 do 3 local num = 100 4 print(1, num)--1 100 5 do 6 print(2, num)--2 100 7 end 8 end 9 print(3, num)--3 nil10 end11 12 main()
運算子算術運算子
包含“+”、“-”、“*”、“/”、“%”等運算子,但是要注意不支援自增自減運算子:
1 num = 102 --下面的寫法都不支援, --直接變注釋了都3 num++4 ++num5 num--6 --num7 --正確的寫法如下8 num = num + 19 num = num - 1
同時簡寫的形式也不支援:
1 num = 102 --簡寫是不支援的3 num *= 54 --正確的寫法如下5 num = num * 5
取餘運算支援小數,因為number類型是以double形式存在的:
1 num = 3.142 num = num % 13 print(num)--0.14
關係運算子
- ==:判斷是否相等;
- ~=:判斷是否不相等;
- <:判斷是否小於;
- >:判斷是否大於;
- <=:判斷是否小於等於;
- >=:判斷是否大於等於;
需要注意的是,table等參考型別是使用地址來進行判斷的:
1 num1 = 10 2 num2 = 10 3 print(num1 == num2)--true 4 5 str1 = "abc" 6 str2 = "abc" 7 print(str1 == str2)--true 8 9 table1 = {1, 2, 3}10 table2 = {1, 2, 3}11 print(table1 == table2)--false邏輯運算子
- and:與,等同C裡的&&;
- or:或,等同C裡的||;
- not:非,等同C裡的!;
我們可以巧用邏輯運算子來實現C中的三元運算子:
1 --C 語言的寫法2 --d = a ? b : c3 --Lua 的寫法4 d = (a and b) or c
控制結構if then
條件判斷語句,我們直接上個例子:
1 num = math.random() 2 print(num) 3 4 if num <= 0.33 then 5 print("A") 6 elseif num <= 0.66 then 7 print("B") 8 else 9 print("C")10 endwhile和repeat
條件迴圈語句,while是先判斷再迴圈,repeat是先迴圈再判斷,例子如下:
1 num = 10 2 3 --while 的條件是如果為真則繼續迴圈 4 while num ~= 0 do 5 num = num - 1 6 print(num) 7 end 8 9 num = 1010 11 --repeat 的條件是如果為真則退出迴圈12 repeat13 num = num - 114 print(num)15 until num == 0
for
迴圈語句;
1 --步長預設為 12 for i = 0, 10 do3 print(i)4 end5 6 --指定步長為 27 for i = 0, 10, 2 do8 print(i)9 end
foreach
迭代遍曆語句,寫法如下:
1 days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}2 3 --i 表示索引, v 表示值4 for i,v in ipairs(days) do5 print(i, v)6 endbreak和return
用法和C中的一致,break用於跳出迴圈,而return用於跳出函數。
不支援的switch、case和continue
Lua中不支援switch-case語句,我們可以使用if elseif來代替;
Lua中不支援continue語句,參考下面的檔案來實現:http://www.jb51.net/article/59099.htm
Lua在5.2的版本中加入了goto語句,可以用來實現continue的效果。
Lua學習筆記(二):基本文法