为什么这不能是本地的呢? [英] Why can't this be local?
问题描述
这是我正在运行的安装程序的虚拟变体。启动器函数似乎看不到GetLevel。至少可以看到第一张照片,但看不到第二张照片,所以该功能永远不会启动。是不是因为代码是在代码中它被启动的位置之后出现的,而在启动器执行点的时候它还不存在呢?当我删除本地标记时,它起作用了。那么,全局函数可以从脚本中的任何位置看到,而本地函数只能从代码的后面部分看到? 我正在尝试找出哪些函数可以本地化,因为它们目前都是全局的。这样做有什么好处吗?整个脚本的本地函数和非本地的函数之间有区别吗?
local UseLevel = true
local Limit = 0
local function Launcher()
print("trying to launch GetLevel now")
GetLevel()
end
local function GetLevel()
print("GetLevel was launched")
if UseLevel then
Limit = 4
else
Limit = 5
end
end
推荐答案
这样做是否有好处-整个脚本的本地函数和非本地的函数之间有区别吗?
使用本地变量有两个好处:
首先,局部变量通常更快,因为它们只使用Lua虚拟机中的寄存器,而全局变量是全局表(实际上是散列映射)中的条目。调用全局函数需要首先索引哈希映射。
其次,本地变量有助于提高代码质量,因为它们仅在其本地作用域(例如,文件,甚至在if分支、循环等)中可见。把一切都放在全球范围内被称为"全球污染",这令人不悦。它还会减慢全球访问速度,因为它会使全局表变得臃肿。请注意,Lua允许使用_ENV
(或在旧版本中为setfenv
)更改环境,因此有时可以在不污染全局环境的情况下省去LOCAL关键字和FORWARD声明。不过,通常您不应该更改环境。
正如Nicol Bolas指出的那样,全局参数通常用于公开接口。您也可以在文件末尾使用return my_api_table
进行此操作;然后可以使用local my_api_table = require(relative_path)
导入API表。
是否因为代码位于代码中启动它的位置之后,而在Launcher执行点时它还不存在?
是的。您可以使用GetLevel
的转发本地声明&q;修复此问题:
local UseLevel = true
local Limit = 0
local GetLevel -- "forward declaration" for Launcher
local function Launcher()
print("trying to launch GetLevel now")
GetLevel()
end
-- This is the same as GetLevel = function() ... end and thus does not set a global variable
-- but instead assigns to the previously declared local variable GetLevel
function GetLevel()
print("GetLevel was launched")
if UseLevel then
Limit = 4
else
Limit = 5
end
end
只需将Launcher
函数放在GetLevel
下面也可以:
local UseLevel = true
local Limit = 0
local function GetLevel()
print("GetLevel was launched")
if UseLevel then
Limit = 4
else
Limit = 5
end
end
local function Launcher()
print("trying to launch GetLevel now")
GetLevel()
end
这篇关于为什么这不能是本地的呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!