在 Lua 中使用块外的局部变量?
Using local variable outside its chunk in Lua?
我在 Lua 中有一个嵌套的 if
。我在第二个 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
如果这样写,npcSpecimen
将保持为空,因为 if npcType
中设置的变量仅保留在该块中。所以为了缓解这个问题,我可以改用全局变量:
if npcType == "spacebandit" then
npcSpecimen = util.pickRandom(self.npcSpecies)
else
npcSpecimen = util.pickRandom(self.npcSpeciesMutant)
end
然而,根据 the documentation,使用全局变量并不是最佳做法,而且速度较慢。
那么最好的方法是什么,这样我就可以将 npcSpecimen
传递给 npcId
?
从技术上讲,答案是否,您不能在其范围之外使用局部变量,这就是局部变量的全部意义所在。但是,您可以通过在使用它的块之外声明它来更改变量的范围:
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)
但是,请注意以下内容不起作用,或者更准确地说,与上面的内容不同:
local foo
if io.read()=="hello" then
local foo = "hello" -- This is another local
end
print(foo) -- This will *always* print nil
我在 Lua 中有一个嵌套的 if
。我在第二个 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
如果这样写,npcSpecimen
将保持为空,因为 if npcType
中设置的变量仅保留在该块中。所以为了缓解这个问题,我可以改用全局变量:
if npcType == "spacebandit" then
npcSpecimen = util.pickRandom(self.npcSpecies)
else
npcSpecimen = util.pickRandom(self.npcSpeciesMutant)
end
然而,根据 the documentation,使用全局变量并不是最佳做法,而且速度较慢。
那么最好的方法是什么,这样我就可以将 npcSpecimen
传递给 npcId
?
从技术上讲,答案是否,您不能在其范围之外使用局部变量,这就是局部变量的全部意义所在。但是,您可以通过在使用它的块之外声明它来更改变量的范围:
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)
但是,请注意以下内容不起作用,或者更准确地说,与上面的内容不同:
local foo
if io.read()=="hello" then
local foo = "hello" -- This is another local
end
print(foo) -- This will *always* print nil