2008-10-12 3 views
9

I Programmierung in Lua meine ersten Schritte nehmen und diese Fehlermeldung erhalten, wenn ich meinen Skript ausführen:Was die Bedeutung von ‚Versuch zu indizieren aufzuwerten‘ ist

attempt to index upvalue 'base' (a function value) 

Es ist wahrscheinlich sehr einfach wegen etwas, dass ich haven Hab 'noch nicht begriffen, aber beim Googlen kann ich keine guten Informationen darüber finden. Könnte mir jemand erklären, was es bedeutet?

+0

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 –

Antwort

12

In diesem Fall sieht es aus base ist eine Funktion, aber Sie versuchen, es wie eine Tabelle zu indizieren (z. B. base[5] oder base.somefield).

Der 'upvalue' Teil sagt Ihnen nur, welche Art von Variable base ist, in diesem Fall ein upvalue (aka externe lokale Variable).

+0

Ah, ja natürlich - so einfach war das. In meiner Verwirrung vermisste ich das Offensichtliche. Vielen dank für Deine Hilfe! – Cactuar

3

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!

Verwandte Themen