为什么要将全局Lua函数设为本地?

时间:2012-02-08 17:47:43

标签: function scope lua

我一直在查看一些Lua源代码,我经常在文件的开头看到这样的内容:

local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc..

他们是否只使本地函数让Lua在经常使用时更快地访问它们?

4 个答案:

答案 0 :(得分:13)

本地数据在堆栈中,因此他们可以更快地访问它们。但是,我严重怀疑setmetatable的函数调用时间实际上是某个程序的一个重要问题。

以下是对此的可能解释:

  1. 防止污染全球环境。模块的现代Lua约定是不让它们直接注册到全局表中。他们应该构建一个本地函数表并返回它们。因此,访问它们的方式是使用局部变量。这迫使许多事情发生:

    1. 一个模块不会意外覆盖其他模块的功能。

    2. 如果模块意外执行此操作,则仍可访问模块返回的表中的原始函数。只有使用local modname = require "modname",您才能确保获得该模块所暴露的内容。

    3. 包含其他模块的模块不会相互干扰。您从require返回的表始终是模块存储的表。

  2. 阅读" local变量的人过早优化,访问速度更快"然后决定制作所有内容local

  3. 一般来说,这是一种很好的做法。好吧,除非是因为#2。

答案 1 :(得分:5)

除了Nicol Bolas的回答,我还要补充第三点:

  • 它允许您的代码在加载后从沙箱中运行。

如果已从沙箱中排除这些功能并且从沙箱中加载代码,那么它将无效。但是如果首先加载代码,沙箱就可以调用加载的代码,并能够从沙箱中排除setmetatable等。

答案 2 :(得分:1)

我这样做是因为它允许我查看每个模块使用的功能

此外,它可以保护您免受其他人在全球环境中更改功能的影响。 它是一种免费(过早)优化是一种奖励。

答案 3 :(得分:0)

另一个微妙的好处:它清楚地记录了模块导入的变量(函数,模块)。如果您正在使用模块语句,它会强制执行此类声明,因为全局环境已被替换(因此全局变量不可用)。