Lua

Lua

Posted by nomadli on September 22, 2017

数据类型

  • 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);