Un "local" trop?
Comme l'explique Mike F, une "upvalue" est une variable locale externe. Cette erreur se produit souvent lorsqu'une variable a été déclarée local
dans une déclaration avant et a ensuite déclaré local
lorsqu'il est initialisé. Cela laisse la variable déclarée vers l'avant avec une valeur de nil
. Cet extrait de code montre ce pas à faire:
local foo -- a forward declaration
local function useFoo()
print(foo.bar) -- foo is an upvalue and this will produce the error in question
-- not only is foo.bar == nil at this point, but so is foo
end
local function f()
-- one LOCAL too many coming up...
local foo = {} -- this is a **new** foo with function scope
foo.bar = "Hi!"
-- the local foo has been initialized to a table
-- the upvalue (external local variable) foo declared above is not
-- initialized
useFoo()
end
f()
Dans ce cas, la suppression du local
devant foo
quand il est initialisé dans f()
fixe l'exemple, à savoir
foo = {}
foo.bar = "Hi!"
Maintenant l'appel Utiliser useFoo() produira la sortie désirée
Hi!
Voici quelques références pour le terme upvalue. Cette page décrit le concept avec un exemple utilisant une fonction anonyme http://www.lua.org/pil/6.1.html et cette publication se plaint du terme upvalue suggérant une alternative http://lua-users.org/lists/ lua-l/2005-11/msg00243.html –