2008-10-12 9 views
9

Je prends mes premiers pas de programmation en Lua et obtenir cette erreur quand je lance mon script:Quelle est la signification de « tentative d'index upvalue »

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

Il est probablement dû à quelque chose de très basique ce havre I Je n'ai pas encore compris, mais je ne trouve pas de bonnes informations à ce sujet quand je google. Quelqu'un pourrait-il m'expliquer ce que cela signifie?

+0

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 –

Répondre

12

Dans ce cas, il semble base est une fonction, mais vous essayez de l'indexer comme une table (par exemple base[5] ou base.somefield). La partie 'upvalue' vous indique simplement quel est le type de variable base, dans ce cas une valeur supérieure (ou variable locale externe).

+0

Ah oui, bien sûr, c'était aussi simple que ça. Dans ma confusion, j'ai manqué l'évidence. Merci beaucoup pour votre aide! – Cactuar

3

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!

Questions connexes