写了将近两年的lua语言,一直都在openresty框架下面进行开发,总结了几点lua语言的技巧记录下来,也给大家提供一些参考,有什么不对的地方可以一起讨论。

1.如果是一些经常用到的全局函数,可以申明为local局部变量,这样可以提升效率。

例如ipairs,pairs申明成local的,原因是local变量是存放在lua的堆栈里面的是array操作,而全局变量是存放在_G中的table中,效率不及堆栈


如果被多次执行调用的全局变量,就需要考虑用local来申明


2.loadfile()只会编译不会执行,如果想用loadfile来执行的话,需要将loadfile的函数设置在一个全局变量下面的一个子变量(模块)中


_G._ImportModule = _G._ImportModule or {}
local _ImportModule = _G._ImportModule
local PathFile = "test2.lua"
local Func, Err = loadfile(PathFile)
local A = {}
setmetatable(A, {__index = _G})
setfenv(Func, A)() -- 等于 setfenv(Func, A), Func()
A.Test2()

3.xpcall和pcall区别


 debug.debug:提供一个Lua提示符,定义错误的等级
debug.traceback:根据调用桟来构建一个扩展的错误消息 





pcall:没有那个错误处理参数,只知道运行错误,不会根据错误处理参数打印错误结果





两者都是提供了lua函数的保护运行机制



4.module(...,package.seeall)的含义



module语句的功能可以通过以下语句来表示:

1.设置一个空的 table,local Table = {}



2._G[ModuleName] = Table



3.package.loaded[ModuleName]=Table



如果module(...,package.seeall)加上了package.seeall参数,则可以这样理解:



4.setmetatable(Table,{__index=_G})



5.setfenv(1,Table):设置当前函数的执行环境都为Table,这样下面定义的函数和变量就不用写Table.***了



现在一般定义模块不提倡使用module来定义了,一般认为使用module模块会污染全局环境变量,同时也破坏了模块的高内聚,因为模块内也可以读写全局属性



5.__index和__newindex区别



__newindex:用于更新设置本表不存在的元素属性时,



如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数。
如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值

6.

rawget和rawset的功能


通过这两个字段可以单纯的给本表获取值和赋值,而不通过元表中的__index和__newindex属性



可以通过__newindex来设置只读表,构造一个方法传入一个table,让一个设置一个空表的__index来指向这个table,同时这个设置__newindex属性