数据类型
- type(变量名) 获取数据类型
- nil 未赋值的变量值为nil,给值赋nil删除变量
- bool 除false nil 为假,其他都为真 0 “” 都为真
- string 不可以修改
- table 可以做为数组或字典,lua唯一的数据结构
- userdata 只有赋值和比较两种操作
- number function thread
变量
- 无类型 i = 0 i = “hello” 直接赋值
- local 局部变量 local i = 0 局部变量速度快
语法
- do end 定义block
- ^(幂) 优先级最高
- not -(负)
-
- / + -(减)
- ..(连接运算符)
- < > <= >= == ~=(不等)
- and
- or 优先级最低
- {} 空表
- i, j = 1, 2 多重赋值 i, j = j, i
- return i, j 多重返回值 return只能出现在块的最后一句
- if condtion then …. elseif condition … else … end
- for i = 1, 10, 2 do … end 10终止值 2步长
- for k, v in ipaires(table) do … end 数组
- for k, v in pairs(table) do … end 字典
- while i < 10 do … end
- repeat …. until i < 10
- break 只能出现在块的最后一句
- setfenv(point, table) 1表示当前函数环境 2为下一个 替换环境表, 现在有_ENV = {} 表可以代替匿名函数变量
- require(modle_name) 加载Lua模块
- package.path = ‘…/?.lua’ 指定加载lua模块路径
- package.cpath = ‘../?.so’ 指定加载动态库的路径
- setmetable(o, self) self.__index = self 用来实现类
Lua标准库
-
String
- string.byte
- string.char
- string.dump
- string.find
- string.format
- string.gmatch
- string.gsub
- string.len
- string.lower
- string.match
- string.rep
- string.reverse
- string.sub
- string.upper
-
Table
- table.concat
- table.insert
- table.maxn
- table.remove
- table.sort
-
Math
- math.abs
- math.acos - math.asin
- math.atan
- math.atan2
- math.ceil
- math.cos
- math.cosh
- math.deg
- math.exp
- math.floor
- math.fmod
- math.frexp
- math.huge
- math.ldexp
- math.log
- math.log10
- math.max
- math.min
- math.modf
- math.pi
- math.pow
- math.rad
- math.random
- math.randomseed
- math.sin
- math.sinh
- math.sqrt
- math.tan
- math.tanh
-
IO
- io.close
- io.flush
- io.input
- io.lines
- io.open
- io.output
- io.popen
- io.read
- io.stderr
- io.stdin
- io.stdout
- io.tmpfile
- io.type
- io.write
-
OS
- os.clock
- os.date
- os.difftime
- os.execute
- os.exit
- os.getenv
- os.remove
- os.rename
- os.setlocale
- os.time
- os.tmpname
-
File
- file:close
- file:flush
- file:lines
- file:read
- file:seek
- file:setvbuf
- file:write
-
Coroutine
- coroutine.yield
- coroutine.wrap
- coroutine.status
- coroutine.resume
- coroutine.running
- coroutine.create
-
Debug
- debug.debug
- debug.getfenv
- debug.gethook
- debug.getinfo
- debug.getlocal
- debug.getmetatable
- debug.getregistry
- debug.getupvalue
- debug.setfenv
- debug.sethook
- debug.setlocal
- debug.setmetatable
- debug.setupvalue
- debug.traceback
Lua模块例子
模块其实是一个table 要求与golang类似 table名 = 模块文件名 return table
modulename = {}
modulename.publicmenber = "public menber"
function modulename.publicFun()
...
end
return modulename
Lua Table例子
-
数组
a = {} a[1] = 1 a[2] = 2 b = \{\{1, 2\}, \{2, 3\}\}
-
链表
list = nil list = {next = list, value = 1}
-
队列
queue = {} function queue:create(o) o = o or {top = 50, bottom = 50} setmetatable(o, self) self.__index = self return 0 end function queue:push(value) this[this.top] = value this.top = this.top - 1 end function queue:pushBack(value) this[this.bottom] = value this.bottom = this.bottom + 1 end function queue:pop() if (this.top == this.bottom) error("queue is empty") end this.top = this.top + 1 local ret = this[this.top] this[this.top] = nil return ret end function queue:popBack() if (this.top == this.bottom) error("queue is empty") end this.bottom = this.bottom - 1 local ret = this[this.bottom] this[this.bottom] = nil return ret end
Lua宿主
- luaL_newstate() 新Lua对象
- luaL_openlibs(lua_State*) 加载模块
- luaL_loadfile(lua_State*, path) 读取脚本文件
- lua_pcall(lua_State*, paramnum, returnnum, errcall) 执行,参数个数,返回值个数,错误处理函数,无错误处理函数时,错误压如栈顶
- lua_getglobal(lua_State*, name) 将Lua全局变量name的值压入当前函数栈
- lua_isnumber(lua_State*, off) off<0相对位置 off>0绝对位置 系列函数, boolean function table string nil cfunction
- lua_tointeger(lua_State*, off) 自栈顶向下off个变量转为整形返3 系列函数, boolean cfunction lstring number pointer thread string
- lua_checkint 校验是int并提取int值 系列函数
- lua_pushinteger(lua_State*, value)压栈顶,系列函数,boolena cclosure cfunction fstring lstring nil number string vfstring
- lua_getfield(lua_State*, tableindex, name)将tableindex中name取出放栈顶
- lua_setfield(lua_State*, tableindex, name)将栈顶元素赋值给tableindex中name,并弹出栈顶
- lua_gettop(lua_State*) 返回栈顶索引,即当前栈深度
- lua_settop(lua_State*, index)设置栈深度,index<当前深度 弹出多余的元素,index > 当前深度 压入nil
- lua_pushvalue(lua_State*, index)拷贝栈index处的值并压入栈顶
- lua_remove(lua_State*, index)删除栈指定index处的值
- lua_insert(lua_State*, index)在指定位置插入栈顶元素,如果指定位置是栈顶则压入,其他情况移动栈
- lua_replace(lua_State*, index)用栈顶元素赋值指定位置的元素并弹栈顶
- lua_gettable(lua_State*, index)栈指定index位置应该是表,栈顶应该是表中元素key,读取表的key对应的值,弹出栈顶key,将值压入栈
- lua_settable(lua_State*, index)栈指定index位置应该是表,栈顶为value,栈-2是key,将表key=value,弹出-1 -2栈
- lua_concat(lua_State*, n)链接栈顶n个元素为字符串,弹出栈顶n个元素,将结果压入栈。数字会自动转字符
- lua_type(lua_State*, index)返回栈index位置元素类型,index错误返回LUA_TNONE
- lua_typename(lua_State*, type)将lua类型枚举转字符串
- lua_checkstack(lua_State*, count)检查栈是否能再容纳count个元素
- ua_rawequal(lua_State*, index1, index2)比较元素内存
- lua_equal(lua_State*, index1, index2)比较元素的值
- lua_register 注册全局C函数
宿主读表例子
score = { chinese=80, english=85 }
lua_getglobal(L, "score");
lua_pushstring(L, "chinese"); //version 5.1前
lua_gettable(L, -2);//栈第二个元素为表、第一个元素索引取值,弹栈,将该值压栈
lua_pop(L, 1); 将80弹出 栈顶为 score
lua_getfield(L, -1, "english"); //version 5.1及以后
lua_pop(L, 1);