Lua 入門教程

2021-10-02 19:27:18 字數 4345 閱讀 7868

表示式控制結構

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 關閉機器 只...