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