表示式控制結構
metatable與metamethod
lua作為一種指令碼語言(解釋型語言),號稱效能最高的指令碼,被廣泛應用在很多需要效能的地方,比如nginx,遊戲指令碼,openresty等等。在我的專案agent中,使用lua指令碼實現了任務處理邏輯。任務執行器在接收到任務時選擇對應的lua指令碼執行任務,與執行器進行解耦,同時支援熱更新。
lua的安裝非常簡單,如果是linux系統,則將make macosx test
替換掉make linux test
curl -r -o
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test
從最簡單的hello world入門
$ lua
> print("hello world")
hello world
nil是一種型別,可以理解為null,它的主要功能是用於區別其他任何值,將nil賦予給乙個全域性變數相當於對它進行刪除。
boolean型別有兩個可選值:false和true。lua將false和nil視為假,將其他值視為真,不同於其他指令碼語言,數字零和空字串也視為真。
number型別用於表示實數,lua沒有整數型別,只有double型。
lua完全採用8位編碼,字串是不可變的值。
> str="hello world"
> print(str)
hello world
lua還可以用一對匹配的雙方括號來界定乙個字串。
> str=[[
>> print("hello world")
>> hello world
>> ]]
> print(str)
print("hello world")
hello world
table型別實現了關聯陣列,是一種具有特殊索引方式的陣列,可以通過整數,字串或其他型別的值來索引,基於table,可以用來表示普通陣列,符號表,集合,記錄,佇列和其他資料結構,lua也通過table來表示模組(module)、包(package)和物件(object)。
array = {}
array[1]=1
array["2"]=2
array[3]="3"
lua中,函式是作為第一類值",可以儲存在變數裡,可以通過引數傳遞給其他函式,還可以作為其他函式的返回值。
local add = function(a,b)
return a+b
endfunction add1(a,b)
return a+b
endprint(add(1,2))
和其他語言一樣,lua支援<,>,<=,>=,==,~=。
邏輯操作有and,or和not。對於操作符and,如果第乙個運算元為假,就返回第乙個運算元,不然返回第二個運算元。對於操作符or,如果第乙個運算元為真,就返回第乙個運算元。
可以使用操作符…(兩個點)
print("hello".."world")
a = 2
if a > 0 then
print("a is positive")
end
a = -1
if a > 0 then
print("a is positive")
elseif a <0 then
print("a is negative")
else
error("a is zero")
end
local i=1
local sum=0
while i < 10 do
sum = sum +i
i = i+1
endprint(sum)
數字型for
語法如下所示,var從exp1變化到exp2,每次變化都以exp3作為步長,若不指定,則預設步長為1。#符號常用來指定陣列的長度。
for var=exp1,exp2,exp3 do
end
舉個簡單的例子
local i=1
local sum=0
for i=1,10,1 do
sum = sum +i
i = i+1
endprint(sum)
泛型for
lua的基礎庫提供了ipairs和pairs,兩者都能用來遍歷集合。兩個的區別是
for i,v in ipairs(array) do
print(v)
endfor i,v in pairs(array) do
print(v)
end
在lua中,每個值都有一套預定義的操作集合,通過元表可以修改乙個值的行為,使其在面對乙個非預定義的操作時執行乙個指定的操作,假設元素a和b都是table型別,可以通過元表定義如何計算表示式a+b。
下面舉了個簡單的例子,用來實現兩個table的相加
local string = require("string")
local format = string.format
//定義兩個分數,fraction1為1/3,fraction2為2/3
local fraction1 =
local fraction2 =
//定義乙個運算操作符
fraction_operator={}
//定義+的操作符過載
function fraction_operator.__add(f1,f2)
res = {}
res.denominator = f1.denominator * f2.denominator
res.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator
return res
end//為前面定義的兩個table設定metatable
setmetatable(fraction1,fraction_operator)
setmetatable(fraction2,fraction_operator)
print(getmetatable(fraction1))
print(getmetatable(fraction2))
local fraction3 = fraction1 + fraction2
print(format("num:%d,den:%d",fraction3.numerator,fraction3.denominator))
lua內部約定的metamethod
__add(a, b) 對應表示式 a + b
__sub(a, b) 對應表示式 a - b
__mul(a, b) 對應表示式 a * b
__div(a, b) 對應表示式 a / b
__mod(a, b) 對應表示式 a % b
__pow(a, b) 對應表示式 a ^ b
__unm(a) 對應表示式 -a
__concat(a, b) 對應表示式 a .. b
__len(a) 對應表示式 #a
__eq(a, b) 對應表示式 a == b
__lt(a, b) 對應表示式 a < b
__le(a, b) 對應表示式 a <= b
__index(a, b) 對應表示式 a.b
__newindex(a, b, c) 對應表示式 a.b = c
__call(a, ...) 對應表示式 a(...)
參考
lua程式設計第二版
CSS入門教程
css是 cascading style sheets 的簡稱,中文翻譯為 串接樣式表 也有人翻譯為 樣式表 css用以作為網頁的排版和風格設計,在web標準建站中,對css的熟悉和使用是相當重要的乙個內容。css的作用是彌補html的不足,讓網頁的設計更為靈活。這個文章只是為您介紹css的基礎應用...
CSS入門教程
css是 cascading style sheets 的簡稱,中文翻譯為 串接樣式表 也有人翻譯為 樣式表 css用以作為網頁的排版和風格設計,在web標準建站中,對css的熟悉和使用是相當重要的乙個內容。css的作用是彌補html的不足,讓網頁的設計更為靈活。這個文章只是為您介紹css的基礎應用...
Linux入門教程
linux下有兩種使用者 1.root使用者,提示符 2.普通使用者,提示符 在 etc目錄下有乙個inittab檔案,其中有一行配置 id 3 defualt 其中,數字3就代表一啟動進入字元終端,如果改為5則代表一啟動進入x window 修改口令 passwd 退出登入 exit 關閉機器 只...