我一直在看一些Lua源代码,我经常在文件的开头看到这样的东西:
local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc..
他们是否只将本地函数设置为让Lua在经常使用时更快地访问它们?
我一直在看一些Lua源代码,我经常在文件的开头看到这样的东西:
local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc..
他们是否只将本地函数设置为让Lua在经常使用时更快地访问它们?
本地数据在堆栈中,因此它们可以更快地访问它们。但是,我严重怀疑函数调用时间 setmetatable
实际上对某些程序来说是个重要问题。
以下是对此的可能解释:
防止污染全球环境。模块的现代Lua约定是不让它们直接注册到全局表中。他们应该构建一个本地函数表并返回它们。就这样 只要 访问它们的方法是使用局部变量。这迫使许多事情:
一个模块不会意外覆盖另一个模块的功能。
如果模块意外地执行此操作,则仍可访问模块返回的表中的原始函数。只有使用 local modname = require "modname"
你能保证得到完全而且只有那个模块暴露的东西。
包含其他模块的模块不能相互干扰。你回来的桌子 require
始终是模块存储的内容。
读者的过早优化local
变量访问速度更快“然后决定制作一切 local
。
一般来说,这是一种很好的做法。好吧,除非是因为#2。
除了Nicol Bolas的回答,我还要补充第三点:
如果函数已从沙箱中排除,并且代码是从沙箱中加载的,那么它将无法正常工作。但是如果首先加载代码,则沙箱可以调用加载的代码并能够从沙箱中排除setmetatable等。
我这样做是因为它允许我查看每个模块使用的功能
此外,它可以保护您免受其他人在全球环境中更改功能。 这是一个免费(过早)优化是一个奖金。
另一个微妙的好处:它清楚地记录了模块导入的变量(函数,模块)。如果您正在使用模块语句,它会强制执行此类声明,因为全局环境已被替换(因此全局变量不可用)。