您好,登錄后才能下訂單哦!
【嘮叨】
首先,我已經默認你已經學過至少一門宿主語言了(C++、Java等),然后轉向學習Lua。
因為51cto中對于Lua語言沒有代碼高亮,為了讓代碼看起來豐富多彩,我只好用截圖了。
本節內容僅介紹Lua的簡單基礎語法,更多用法請百度:Lua中文教程 、 Lua參考手冊 。
基于Lua 5.1。
【學習感慨】
> 語句末尾不需要加分號 ;
> 語句塊不是用花括號 { } , 而是 do 語句塊 end 表示語句塊的開始和結束。
而 花括號 {} 表示的為一個 表結構 。
> 運算符 ^ :表示冪運算。(即 2^10 = 1024)
> 不等于號為: ~= 。
> 變量的定義不需要加數據類型。直接 a = 10。
> 且(and)、或(or)的運算返回值不是true/false。而是運算符左邊或右邊的變量值。
> 除了 nil、false 為假,其余的均為真。( 0 和 空串"" 也為真)。
> 變量的賦值可以多個一起賦值。( a,b,c = 10,20,30 )。
> 函數可以返回多個值。( return a,b,c )
> Lua中數據結構類型只有唯一的一個:表(table)。
它既可以表示一個數組,也可以是一個數據結構,或者是一個類。
> 數組下標從 1 開始,而不是 0 。
【致謝】
《Programming in Lua》中文版 , 翻譯由 www.luachina.net 完成。
0、Lua環境配置
可以去lua官網 www.lua.org 下載資源文件,然后在文本編輯器來編寫。
也可以使用 eclipse ,下載 ldt 插件,就可以在 eclipse 中編寫Lua的代碼了。
0、Lua的一個例子
先來看看Lua的一個例子,圖個新鮮。
注:下面的代碼是可以直接運行的。對,不需要main函數!
0、導入文件 require
搜索目錄加載文件,并判斷是否文件是否已經加載,避免重復加載同一文件。
其中:".lua" 可以省略。
require "hello.lua"
require("hello2")
require "hello3"
1、數據類型
> 在Lua中,定義一個變量的時候,不需要寫數據類型。
> Lua中就直接這樣定義:a = 10; b = "Hello World" 。
2、注釋
(1)單行注釋: --
(2)多行注釋: --[[ --]]
3、輸出語句
4、保留關鍵字
5、運算符
5.1、算術運算符
> 其中 ^ 為 冪運算。
5.2、關系運算符
> 其中 ~= 為 不等于。
5.3、邏輯運算符
> Lua里的邏輯運算符不是返回 true/false ,而是 a 或者 b。
> 其中,三目運算符可以表示成如下所示。
使用舉例:
a = 10。
(1)第一個判斷:a>=0為真,故表達式返回的值為 a<=5
而a<=5為假,所以 a>=0 and a<=5 為假,不執行print("111")
(2)繼續判斷第二個,a<=9為假,故表達式返回值為 a>=11
而a>=11為假,所以 a<=9 or a>=11 為假,不執行print("222")
(3)其余情況,執行 print("333")
5.4、拼接運算符
> 兩個點 .. 為字符串的拼接運算。
5.5、優先級
> 其中 ^ 和 .. 為右鏈接,其余為從左到右依次運算。
> 優先級如下:
6、變量賦值、以及作用域
(1)局部變量(local)、全局變量。
(2)多重賦值
> 賦值等號左邊為變量,右邊為所賦的值。會按順序依次賦值。
7、代碼塊
> 使用 do end 。
8、控制語句
這里可能涉及到表(table)的知識,這個在后續會介紹。
8.1、條件語句 if-else-then
> elseif 中間沒有空格。
> 不要忘了后面的 then 。
8.2、循環語句 while-do
> 和C++中的用法類似。
8.3、循環語句 repeat-until
> 和C++中的 do-while 用法類似。
8.4、循環語句 for-do
使用for循環語句是Lua中最常用的。
(1)用法一:數值遍歷
(2)用法二:數組遍歷
(3)用法三:數組遍歷(ipairs)
> 使用 for key, var in ipairs(t) do end
(4)用法四:表遍歷(pairs)
> 遍歷整張表,輸出表中所有數據。
> 使用 for key, var in pairs(t) do end
(5)ipairs 與 pairs 的區別
> ipairs :主要用于表數組的遍歷,即表的下標均為正整數,且從1~n連續。
不能返回nil,只能返回數字0,如果遇到nil則推出。
它只能遍歷到表中出現的第一個不是整數的鍵。
> pairs :用于遍歷整張表。
可以遍歷表中所有的鍵,且除了迭代器本身以及遍歷表本身還可以返回nil
9、函數 function
函數的定義如下:
(1)function 函數名(參數列表) 語句塊 end
(2)函數名 = function(參數列表) 語句塊 end
9.1、可變參數
在函數的參數列表最后面使用三個點 ... ,表示輸入參數可變。
而可變的參數會保存在一個表數組 arg 中。
9.2、多返回值
函數可以返回多個值。
舉例說明:
9.3、函數多返回值的丟失
-- :如果fun為表達式最后一個,所有返回值將被返回
-- :如果fun不是最后一個 ,只有第一個值被返回
9.4、函數閉包
先來看一下閉包的一個例子。
我們可以發現newCounter()里有一個局部變量i,并且函數的返回值是閉包內的函數。
(1)定義:
> newCounter() :父函數;
> 局部變量i :父函數內的局部變量;
> 返回值匿名函數 :父函數內的子函數。
(2)函數返回值為一個子函數,且子函數可以使用父函數內的局部變量i。
如果你知道了Lua中的函數也可以像變量一樣進行賦值的話,你就不難理解上訴的三個print的輸出為什么是那樣的。
實際上,上訴代碼中的 c1 和 c2 被賦予的值就是閉包內的匿名函數。而執行 c1()、c2() 就相當于是調用一次閉包newCounter()中的匿名函數。
這就類似創建了一個C++類的實例對象(假設實例對象名為obj)。
類里面有一個成員變量i,以及一個成員函數。而c1()指向的是該實例對象中的成員函數。
所以每調用一次c1(),就相當于是執行了一次 obj->匿名函數() 。這樣就改變了對象obj里的成員變量i的值。
而Lua閉包中創建的 c1、c2 就相當于是創建了兩個這樣的實例對象(obj1,obj2)。所以每執行它們一次,對象內部的變量i的值都會發生變化。
也有這樣的一個比喻:Lua中的閉包類似于一個C++函數,而函數內部的變量i相當于是一個函數中的靜態變量。
再來一個例子:(有了上述形象的類比,相信你能看懂下面的代碼)
這就相當于創建了一個C++類的實例對象obj。
類里面有一個成員變量i,以及兩個成員函數InnerFunc1()、和InnerFunc2()。
而 a、b 分別指向的是該實例對象obj中的成員函數InnerFunc1()、和InnerFunc2()。
調用一次 a() :就相當于是執行了一次obj->InnerFunc1() 。
調用一次 b() :就相當于是執行了一次obj->InnerFunc2() 。
10、表(table)
Lua中的數據結構只有一個:表(table)。
原理:鍵值對 key - value 。
10.1、表示一個數組
前提條件為:數組的下標均為正整數,且連續賦值。
并且在Lua中,數組的下標從 1 開始。( t[1] , t[2] , t[3] ...)
(1)數組的定義:
t = { 值1 , 值2 , 值3 , ... , 值n }
(2)獲取數組元素個數:使用 #
#t
舉例:
10.2、表的用法
(1)初始化賦值
(2)表成員的使用方法
(3)補充
下標不一定是整數或字符串,也可以使浮點數。
t = { [91.23] = true }
t[91.23] = false
【補充知識】
1、兩個對象的比較
"0" == 0 -- false 2 < 15 -- true "2" < "15" -- false (字典序)
2、數值與字符串運算(+-*/)
string 和 numbers 進行運算時,string會被轉化成數值進行運算
print("10" + 1) --> 11 print("10" + "1") --> 11 print("20" * "3") --> 60 -- 拼接運算符 print("10" .. 1) --> 101
3、求數組的長度(使用 #)
a = {1,2,3,4,5} print(#a) -- 5
基礎語法講完了,請待下回分解。。。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。