Lua 中,将全局函数声明为local的优缺点

在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属性

你可能感兴趣的:(LUA)