Ein "local" zu viele?
Wie Mike F erklärt, ist ein "upvalue" eine externe lokale Variable. Dieser Fehler tritt häufig auf, wenn eine Variable in einer Forward-Deklaration als local
deklariert und dann beim Initialisieren erneut deklariert wird. Dies lässt die nach vorne deklarierte Variable mit einem Wert von . Dieser Code-Schnipsel zeigt, was nicht zu tun:
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()
In diesem Fall die local
vor foo
zu entfernen, wenn es in f()
behebt das Beispiel, das heißt
foo = {}
foo.bar = "Hi!"
nun der Aufruf initialisiert to useFoo() erzeugt den gewünschten Ausgang
Hallo!
Hier sind ein paar Referenzen für den Begriff upvalue. Diese Seite beschreibt das Konzept mit einem Beispiel unter Verwendung einer anonymen Funktion http://www.lua.org/pil/6.1.html und dieses Posting beschwert sich über den Begriff upvalue, der eine Alternative http://lua-users.org/lists/ vorschlägt lua-l/2005-11/msg00243.html –