为什么这不能是本地的呢? [英] Why can't this be local?

查看:26
本文介绍了为什么这不能是本地的呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我正在运行的安装程序的虚拟变体。启动器函数似乎看不到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆