在 Lua 中使用其块之外的局部变量?

dea*_*ock 2 variables lua if-statement local-variables

我有一个嵌套if在Lua中。我在第二if层中有一个变量,我想在第一层中使用它。

变量是npcSpecimen.

if conditions then
  local npcType = util.pickRandom(self.npcTypes)
  local npcSpecimen = "" 
  
  if npcType == "spacebandit" then
    local npcSpecimen = util.pickRandom(self.npcSpecies)
  else
    local npcSpecimen = util.pickRandom(self.npcSpeciesMutant)
  end

  local npcId = space.spawnNpc(spawnPosition, npcSpecimen, npcType)
end
Run Code Online (Sandbox Code Playgroud)

如果以这种方式编写,npcSpecimen则将保持为空,因为 中设置的变量if npcType仅保留在该块中。因此,为了缓解这个问题,我可以使用全局变量来代替:

  if npcType == "spacebandit" then
    npcSpecimen = util.pickRandom(self.npcSpecies)
  else
    npcSpecimen = util.pickRandom(self.npcSpeciesMutant)
  end
Run Code Online (Sandbox Code Playgroud)

然而,根据文档,使用全局变量不是最佳实践,而且速度较慢。

那么,解决这个问题的最佳方法是什么,以便我可以传递npcSpecimennpcId

Dar*_*yer 5

从技术上讲,答案是否定的,您不能在其范围之外使用局部变量,这就是局部变量的全部要点。但是,您可以通过在使用变量的块之外声明它来更改变量的范围:

local foo
if io.read() == "hello" then -- Just a dumb example condition :)
   foo = "hello" -- This is not a global, as it was declared local above
end
print(foo)
Run Code Online (Sandbox Code Playgroud)

但是,请注意,以下内容不起作用,或者更准确地说,与上面的效果不同:

local foo
if io.read()=="hello" then
   local foo = "hello" -- This is another local
end
print(foo) -- This will *always* print nil
Run Code Online (Sandbox Code Playgroud)