lua语言的几点技巧

写了将近两年的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区别
xpcall:多提供一个形参来表示表示错误处理参数
 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区别
__index:设置元表时,可以通过setmetatable(Table1,{__index=Table2}),这样相当于Table1中查找不到的元素会在Table2中查找
__newindex:用于更新设置本表不存在的元素属性时,
如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数。
如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值
6. rawget和rawset的功能
通过这两个字段可以单纯的给本表获取值和赋值,而不通过元表中的__index和__newindex属性
可以通过__newindex来设置只读表,构造一个方法传入一个table,让一个设置一个空表的__index来指向这个table,同时这个设置__newindex属性





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值