tar zxvf lua-5.x.x.tar.gz cd lua-5.x.x make linux test make install
注释
1 2 3 4 5 6
--单行注释
--[[ 多行注释 多行注释 --]]
变量
数据类型
数据类型
描述
nil
表示一个无效值,只有值nil属于该类,相当于条件表达式中的false
boolean
true(0,空字符串是true)或者false(只有nil和false是false)
number
双精度类型的实浮点数
string
‘’或””或[[]]表示
function
c或lua编写的函数
userdata
用来将任意c数据结构保存到lua变量中
thread
用来实现coroutine
table
关联数组
Lua中的变量默认是全局变量,哪怕是语句块或函数里。除非用local显示声明为局部变量。
变量的默认值均为nil。
1 2
a = 5 local b = "hey"
lua可以对多个变量同时赋值,赋值语句右边的值会依次赋给左边的变量。
1 2 3 4 5 6 7 8
--[[ 1. 变量个数 > 值个数 按变量个数补足nil 2. 变量个数 < 值个数 多余值被忽略 ]]-- a, b, c = 0, 1-->0 1 nil a, b = a+1, b+1, b+2-->1,2 b+2忽略 a, b, c = 0-->0 nil nil x, y = y, x -- swap x, y
流程控制
while
1 2 3 4 5 6 7
sum = 0 num = 1 while num <= 100do sum = sum + num num = num + 1 end print("sum = ",sum)
for
1 2 3 4 5 6
sum = 0 for i=1, 100do --> for i = 1, 100, 2 do --> for i = 100, 1, -2 do sum = sum + i end
until
1 2 3 4 5
sum = 2 repeat sum = sum ^ 2 print(sum) until sum > 1000
if-else
1 2 3 4 5 6 7 8 9 10
a = 100 if(a == 10) then print("a == 10") elseif a == 20then-->可以不带括号 print("a == 20") elseif(a == 30) then print("a == 30") else print("a nothing") end
函数
递归
1 2 3 4 5 6
functionfib(n) if n < 2then return1 end return fib(n-2) + fib(n-1) end
闭包
1 2 3 4 5 6 7 8 9 10 11
functionnewCounter() local i = 0 returnfunction() i = i + 1 return i end end
ci = newCounter() print(c1()) print(c1())
多返回值
1 2 3 4 5 6 7 8 9 10 11 12
functionmaximum(a) local mi = 1 local m = a[mi] for i,val inipairs(a) do if val > m then mi = i m = val end end return m, mi end print(maximum({8,10,23,12,3,9}))
table & metatable
表table
1 2 3 4 5 6 7 8 9 10 11
atable = {}
atable[1] = "lua" atable = nil--移除引用,lua垃圾回收会释放内存
arr = {"string", 100, "haoel", function()print("cooool") end} for i = 1, #arr do --for k, v in pairs(arr) do -- print(k, v) print(arr[i]) end
functiontable_maxn(t) local mn = 0 for k, v inpairs(t) do if mn < k then mn = k end end return mn end
arrtable = setmetatable({1,2,3}, { __add = function(table1, table2) for i = 1, table_maxn(table2) do table.insert(table1, table_maxn(table2)+1, table2[i]) end return table1 end })
functionShape:new(o, side) o = o or {} --> or运算符 A or B若A为true,则返回A,否则返回B setmetatable(o, self) self.__index = self-->防止扩展后被改写 side = side or0 self.area = side * side; return o end
functionShape:printArea() print("area is: ",self.area) end myshape = Shape:new(nil,10) myshape:printArea()
Rectangle = Shape:new() --派生类方法 functionRectangle:new(o, length, breadth) o = o or Shape:new(o) setmetatable(o, self) self.__index = self self.area = length * breadth return o end
functionRectangle:printArea() print("Rectangle area is: ",self.area) end