Lua作為一款輕量級的腳本語言,由標准C編寫而成,可被C/C++調用,也可調用C/C++的函數。
在目前的腳本引擎中,Lua的速度是最快的。。。
Lua可直接在EditPlus文本處理器上開發,只需搭建相應的開發環境即可。GO GO GO
先說說我和Lua是如何相識的吧*^-^*。。。
故事的開始是這樣滴。。。在一個陽光明媚的。。。。我來。。。就在公司認識了Lua。。。
然后我們就開始了一段刻苦銘心的。。。和白首到老的XIN
為什么我要選擇學Lua???很簡單。。。起初是因為公司需要。。。在慢慢的接觸過程中。。。
發現Lua原來是這么的耐人尋味。。。
就好比愛情,,,可以是一見鍾情的 、也可以是日久生情的。。。Lua可能更適合和我細水長流了吧!!!
一見鍾情是因為被外表吸引,日久生情就是對對方內心世界的閱讀與欣賞了。。。
一見鍾情並不一定是長久的。。。也許大概可能會隨着歲月的流逝越發平淡。。。
反而日久生情卻可以成就白首的一生。。。一見鍾情的最終也是最好歸宿就是日久生情。。。
所以。。。雖然我和Lua的開始並不是所謂的完美。。。但是我們會為了奔向完美的結局而努力滴。。。
既然都已經在一起了。。。之間的磕磕絆絆是在所難免的。。。所以如果你看出我們之間存在的問題。。。
麻煩幫我們糾正。。。為了我和Lua的天長地久在此先行謝過了。。。*^_^* *^_^* *^_^*
一、Lua中的一些特殊字符
1、單行注釋 --注釋內容; 多行注釋 --[[ 注釋內容 ]]
2、使用#來計算字符串的長度。
str = "www.baidu.com" print(#str)
輸出:13
3、..用來連接兩個字符串
str1 = "hello" str2 = "world" print(str1 .. ' ' .. str2)
輸出:hello world
4、不等號是~=而不是!=
print(10 ~= 10) print(10 ~= 3)
程序運行輸出:
---------- 新建程序 ---------- false true 輸出完成 (耗時 0 秒) - 正常終止
5、字符串可用單引號、雙引號和[[ ]]來表示
str1 = "java" str2 = 'lua' str3 = "\"hello\"" str4 = [[world]]
程序運行輸出:
---------- 新建程序 ---------- java lua "hello" world 輸出完成 (耗時 0 秒) - 正常終止
二、Lua字符串操作
1、gsub方法:l為被替換字符,m為要替換的字符,2為替換的次數,不寫默認為全部替換
--輸出:hemmo world java lua 2 print(string.gsub("hello world java lua", "l", "m", 2))
2、find方法:Java為要查找的字符串,1是索引,即查找從索引1開始查起,不存在則返回nil
--輸出:13 16 print(string.find("hello world java lua", "java", 1))
3、reverse方法:反轉字符串; upper/lower方法:大小寫轉換; len方法:計算字符串長度
rep方法:返回字符串的n個拷貝; format方法:格式化字符串
--輸出:aul print(string.reverse("lua")) --輸出:LUA print(string.upper("Lua")) --輸出:lua print(string.lower("Lua")) --輸出:3 print(string.len("lua")) --輸出:lualualua print(string.rep("lua", 3)) --輸出:日期格式化:2016/04/07 year = 2016; month = 4; day = 7 print(string.format("日期格式化:%04d/%02d/%02d", year, month, day))
對%04d做一個補充:04代表整數不足4位左邊用0補齊。
三、Lua知識點儲備
1、Lua中的8中基本類型:
nil、number、boolean、string、userdata、thread、table,function
2、在默認情況下,變量總是認為是全局變量,局部變量的定義用local關鍵字修飾
刪除一個全局變量,只需將變量賦值為nil即可。EG:a = nil
3、遍歷輸出1-10,Lua循環使用語法介紹
for遍歷:
for i = 1, 10 do if i == 5 then print('is:' .. i) else print(i) end end
while遍歷:
local n = 0 while true do n = n + 1 if n > 10 then break else print(n) end end
repeat...until遍歷
local n = 0 repeat n = n + 1 io.write(n .. ' ') until n >= 10
if...else判斷語句語法
num = 3; if num > 10 then print("> 10") elseif num == 10 then print("== 10") else print("< 10") end
如果不想控制每次打印都換行,可將print(n)替換為io.write(n .. ' ')
4、兩變量交換值
x, y = 10, 20 x , y = y, x print("x=" .. x .. ' y=' .. y)
程序運行輸出:x=20 y=10
5、全局變量與局部變量
在Lua中,如果沒有用關鍵字local修飾,全都視為全局變量。
Lua是用Table(表)來管理全局變量的。把所有的全局變量都存儲在一個叫'_G'的表中。。。
local num = 30 str = "hello lua" print(_G.num) --訪問全局變量num,因為num被定義為局部變量。所以輸出為nil print(_G.str) --訪問全局變量str
程序運行輸出:
---------- 新建程序 ---------- nil hello lua 輸出完成 (耗時 0 秒) - 正常終止
四、Lua中的table(表)用法
Lua中的table其實就是key-value鍵值對形式的數據結構。長的和java里的HashMap像極了。。。
初始化表:myTable = {}
--數組形式
myTable = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thurday", "Friday", "Saturday"} for index in pairs(myTable) do io.write(myTable[index] .. ' ') end print("第一個元素:" .. myTable[1])
程序運行輸出:
---------- 新建程序 ---------- Sunday Monday Tuesday Wednesday Thurday Friday Saturday 第一個元素:Sunday 輸出完成 (耗時 0 秒) - 正常終止
Lua中的數組和table
--數組形式 myTable = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thurday", "Friday", "Saturday"} --table形式。。。與數組形式是等價的 --myTable = {[1] = "Sunday", [2] = "Monday", [3] = "Tuesday", [4] = "Wednesday", [5] = "Thurday", [6] = "Friday", [7] = "Saturday"} for index = 1, #myTable do io.write(myTable[index] .. ' ') end
程序運行輸出:
---------- 新建程序 ---------- Sunday Monday Tuesday Wednesday Thurday Friday Saturday 輸出完成 (耗時 0 秒) - 正常終止
languges = { first = "java", second = "lua", third = "struts", fourth = "hibernate", fifth = "spring", "all" } print("遍歷languges:") for k, v in pairs(languges) do print(k .. ':' .. v) end print('分析languges:') print("first:" .. languges["first"]) print(languges[1]) print(languges[2]) print("third:" .. languges["third"])
程序執行結果:
遍歷languges: 1:all fifth:spring fourth:hibernate first:java third:struts second:lua 分析languges: first:java all nil third:struts
五、table用法的延伸
courses = { {name="java", ip="192.168.110.187"}, {name="lua", ip="10.3.255.8"}, {name="jQuery", ip="192.168.110.54"}, {name="CSS", ip="192.168.110.134"}, {name="ORACLE", ip="10.2.255.34"}, } --按照name對network進行排序 table.sort(courses, function(a, b) return (a.name > b.name) end) --遍歷輸出network的值 print "排序后courses為:" for o in pairs(courses) do local temp = '' --temp為局部變量 for k, v in pairs(courses[o]) do temp = temp .. ',' .. k .. '_' .. v end -- print(string.sub(temp, 2, string.len(temp)))
-- print(string.sub(temp, 2, #temp)) --可以根據#temp來獲取temp的長度
print(string.sub(temp, 2)) --下標從1開始算而非0 end
程序運行輸出:
---------- 新建程序 ---------- 排序后courses為: name_lua,ip_10.3.255.8 name_java,ip_192.168.110.187 name_jQuery,ip_192.168.110.54 name_ORACLE,ip_10.2.255.34 name_CSS,ip_192.168.110.134 輸出完成 (耗時 0 秒) - 正常終止
六、Lua中的function(函數)用法
1、簡單的函數語法與代碼實現
function fac (n) if n <= 0 then return 1 else return n * fac(n-1) end end print(fac(5))
2、函數作為變量的形式
maxNum = function(x, y) if x > y then return x else return y end end print('maxNum=' .. maxNum(12, 6))
程序運行輸出:
---------- 新建程序 ---------- maxNum=12 輸出完成 (耗時 0 秒) - 正常終止
3、函數可有多個返回值
function maxMin(arr) maxNum, minNum = arr[1], arr[1] for index in pairs(arr) do if arr[index] > maxNum then maxNum = arr[index] end if arr[index] < minNum then minNum = arr[index] end end return maxNum, minNum end myTable = {12, 34, 3, 67, 54, 33, 87, 34} maxNum, minNum = maxMin(myTable) print("maxNum=" .. maxNum .. " minNum=" .. minNum)
程序運行輸出:
---------- 新建程序 ---------- maxNum=87 minNum=3 輸出完成 (耗時 0 秒) - 正常終止
4、函數中參數的個數可以是可變的
function ave(...) args = {...} sum = 0; for i, v in ipairs(args) do sum = sum + v end return sum / #args end print(ave(12, 34, 3, 1, 54, 33, 87, 34)) --程序輸出:32.25
5、函數實現迭代器功能
function square(iteratorMaxCount, currentNumber) if (currentNumber < iteratorMaxCount) then currentNumber = currentNumber + 1 return currentNumber, currentNumber * currentNumber end end for index, sqr in square,5,0 do print(index, sqr) end
程序運行輸出:
---------- 新建程序 ---------- 1 1 2 4 3 9 4 16 5 25 輸出完成 (耗時 0 秒) - 正常終止
七、Lua中的pairs和ipairs的區別
subArr = {"java", "lua", "c", "c++", "jQuery"}
userInfo = {name="zhangsan", age = 12, sex = "man", addr = "shenzhen"}
--ipairs可替換為pairs
for k,v in ipairs(subArr) do
print('k=' .. k .. ' v=' .. v .. ' ' .. subArr[k])
end
print()
--pairs不可替換為ipairs
for k,v in pairs(userInfo) do
print('k=' .. k .. ' v=' .. v .. ' ' .. userInfo[k])
end
程序運行輸出:
---------- 新建程序 ---------- k=1 v=java java k=2 v=lua lua k=3 v=c c k=4 v=c++ c++ k=5 v=jQuery jQuery k=age v=12 12 k=addr v=shenzhen shenzhen k=name v=zhangsan zhangsan k=sex v=man man 輸出完成 (耗時 0 秒) - 正常終止
相同程序使用pairs和ipairs輸出結果的不同
local subjects = { "java", "lua", [3] = "c", [6] = "c++", [5] = "jQuery", "css", [7] = "jsp" } for k, v in pairs(subjects) do --將pairs替換為ipairs對比輸出結果 print(k, v) end
執行結果輸出:
使用pairs的輸出如下
---------- 新建程序 ---------- 1 java 2 lua 3 css 5 jQuery 6 c++ 7 jsp 輸出完成 (耗時 0 秒) - 正常終止
使用ipairs的輸出如下:
---------- 新建程序 ---------- 1 java 2 lua 3 css 輸出完成 (耗時 0 秒) - 正常終止
從上面的代碼執行結果可以看出:
pairs可以遍歷表中的所有key,還可以返回nil;
ipairs不能返回nil,只能返回數字0,遇到nil程序直接退出。
八、Lua連接MySql數據庫
require "luasql.mysql" --mysql = require "luasql.mysql" --寫法2 --創建環境對象 env = luasql.mysql() --env = mysql.mysql() --寫法2 --連接數據庫 conn = env:connect("lua", "root", "******", "localhost", 3306) --conn = env:connect(數據庫名稱, 賬號, 密碼, IP地址, 端口號) --設置數據庫的編碼格式 conn:execute"SET NAMES UTF8" --執行數據庫操作 cur = conn:execute([[select * from userInfo]]) --此處的a指的是以附加的方式打開只寫文件 row = cur:fetch({}, "a") --文件對象的創建,順便將表信息存儲在userInfo.txt文本中 file = io.open("userInfo.txt","w+"); while row do var = string.format("%d %s %d %s\n", row.id, row.name, row.sex, row.address) print(var) file:write(var) row = cur:fetch(row, "a") end file:close() --關閉文件對象 conn:close() --關閉數據庫連接 env:close() --關閉數據庫環境
程序運行輸出:
---------- 新建程序 ---------- 1 zhangsan 1 shenzhen 2 lisi 1 shanghai 3 wangwu 0 beijing 4 sunfang 0 xiamen 5 linli 1 fuzhou 6 zhaoliu 0 hangzhou 輸出完成 (耗時 0 秒) - 正常終止
其中userInfo表結構設計如下:

用lua進行面向對象的編程,聲明方法和調用方法統一用冒號,對於屬性的調用全部用點號
今天就寫這么多了。。。等實際項目開發中再進行補缺補漏了。。。
初次接觸Lua,個人感覺即不排斥也沒有很高的熱情。。。也許是缺乏開發經驗,,,
現在無法從實際開發項目中體會到Lua的強大吧。。。
我和Lua並非一見鍾情,但我們卻相信日久生情!!!
在最無能為力的時候,卻遇到了最想照顧一生的那個人。。。
