1.lua特性
开源,轻量级,c语言编写实现,实现面向对象有点绕,执行效率高
2.lua开发环境
2.1. linux
-- 下载lua包、解压
wget -c http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxvf lua-5.3.0.tar.gz
-- 下载libreadline相关支持
sudo apt-get install libreadline5
sudo apt-get install libreadline-gplv2-dev
-- 编译安装
cd lua-5.3.0
make linux
sudo make install
-- 测试命令
lua2.2. windows
- 运行环境 LuaForWindows –> https://github.com/rjpcomputing/luaforwindows/releases
- IDE pycharm –> https://blog.csdn.net/u012911347/article/details/82191541
3.基本语法
3.1. 注释
-- 这是一条注释
--[[
这是多行注释
--]]3.2. 在lua中用end给代码分段(function、if、while、for都是以end结束),局部变量的作用域是从定义到对应的end结束
3.3. 局部变量要用local修饰,没有local修饰的都是全局变量(o my god!!)
3.4. 类型有nil、bool、number、string、function、userdata(任意的c数据结构)、thread、table
3.5. lua中只有false和nil是假的,如果写if 0 then 这样后面的语句是会被执行的(是不是感觉很反人类)
if 0 then
print('0 is true')
end
3.6. type函数的返回类型是string
if type(x) == 'nil' then
print('x type is nil')
end
3.7. table是lua中最主要的数据结构, table是kv的模式,如果没有写key值lua会默认给一个从1开始的key值
local tab01 = {a='a',b='b',c='c',1,2,d='d',3}
--print使用..拼接打印
print('a:'..tab01.a) -- a:a
print('d:'..tab01['d']) -- d:d
print('1:'..tab01[1]) -- 1:1
print('3:'..tab01[3]) -- 3:3
-- insert(table, [pos], val)
-- pos不填为尾插。pos这个值最好是正常使用不要越界,因为在排序的时候会出问题
tab02 = {4,3,2,1}
table.insert(tab02, 4, 5) -- 在这里pos的值确保在[1, 5]
print(table.concat(tab02)) --43251
-- 自定义table打印函数
tab_print = function(tab)
for k, v in pairs(tab) do
io.write(v)
end
io.write('\n')
end
-- sort排序 排序的时候是从1开始到‘第一个为nil’的index,在这个index之后的数据是不会参与排序
-- 上面的引号解释,如果赋值table内的元素为nil,排序是会出问题的
tab02[100] = 0
table.sort(tab02)
print(table.concat(tab02)) --12345
tab_print(tab02) -- 123450
-- remove(table, [pos,]) 默认是尾插
table.remove(tab02, 5)
print(table.concat(tab02)) --1234
tab_print(tab02) -- 12340
-- getn(table)
print(table.getn(tab02)) --4
print(#tab02) --4
3.8. 迭代器
--pairs遍历table中的所kv
--ipairs遍历table从1开始到‘第一个为nil’的index
local tab01 = {a='a',b='b',c='c',1,2,d='d',3}
tab01[100] = 100
--pairs
for k, v in pairs(tab01) do
io.write(k..':'..v..',')
end
io.write('\n')
--ipairs
for k, v in ipairs(tab01) do
io.write(k..':'..v..',')
end
io.write('\n')
3.9. 自己创建的带状态的迭代器
-- 使用闭包函数在1,2之间循环,直到条件不满足的时候跳出闭包函数
function iterator(tab)
local index = 0
local count = #tab
return function() -- 闭包函数 1
index = index + 1
if index <= count then
return tab[index] -- 返回迭代器的当前元素 2
end
end
end
tab = {1,2,3,4,5,6}
for v in iterator(tab) do
io.write(v..',')
end
io.write('\n')
3.10. lua的垃圾内存回收机制,当一块内存没有被引用后就会被回收,去除引用的方式是直接给变量赋值为nil
3.11. 运算符
* ~= 是不等于
* ..链接两个字符串
* \# 返回字符或者表的长度3.12. string的三种表示 ‘’ “” [[]],string的拼接也可以用format
x='1'
y="2"
z=[[3]]
print(string.format("%s+%s=%s",x,y,z))
3.13. 可变参
function average(...)
sum = 0
local args={...}
for i,v in ipairs(args) do
sum = sum + v
end
return sum/#args
end
4.table实现面向对象
4.1. lua实现面向对象的机制
- 函数也是一个类型,table中可以包含函数
- 使用:的函数,会自带一个self参数,用来指明是哪个table调用的
- 设置原表setmetatable(table, meta_table),在table中找不到的元素,lua会去meta_table._index表中去找, 但是元方法就不会去metatable.__index中去找
- 下面是实现了一个相对目前认为是比较简单的类继承
local Father = {} local Son = {} Father.__index = Father -- 这样写可以少一个中间table Son.__index = Son function Father.new() local o = {} setmetatable(o, Father) return o end function Son.new() local o = {} -- 1 setmetatable(o, Son) -- 2 return o end setmetatable(Son, Father) -- 3 function Father:printf() print("Father printf") end --[[ -- 注释1 function Son:printf() print("Son printf") end --]] local x = Son.new() x:printf() -- 解释下这个x:printf()的调用过程 -- 1. 首先x是个table -- 2. table中没有printf函数就会去Son中找 如果注释1打开就会调用Son:printf() -- 3. Son中也没有printf函数就要去Father中找
文档更新时间: 2026-03-31 17:38 作者:morninglu
