Что означает «попытка проиндексировать upvalue»

Я делаю свои первые шаги в программировании на Lua и получаю эту ошибку при запуске своего скрипта:

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

Вероятно, это связано с чем-то очень простым, чего я еще не понял, но я не могу найти полезную информацию об этом при поиске в Google. Может ли кто-нибудь объяснить мне, что это значит?


person Cactuar    schedule 12.10.2008    source источник
comment
Вот несколько ссылок на термин upvalue. Эта страница описывает концепцию с примером использования анонимной функции lua.org/pil/6.1.html, и это сообщение жалуется на термин upvalue, предлагающий альтернативу lua-users.org/lists/lua-l/2005-11/msg00243.html   -  person Richard Chambers    schedule 17.12.2012


Ответы (2)


В этом случае выглядит base как функция, но вы пытаетесь индексировать ее как таблицу (например, base[5] или base.somefield).

Часть «upvalue» просто говорит вам, что это за переменная base, в данном случае это upvalue (также известная как внешняя локальная переменная).

person Community    schedule 12.10.2008
comment
Ах, да, конечно - это было так просто. В замешательстве я упустил очевидное. Большое спасибо за твою помощь! - person Cactuar; 12.10.2008

Одного "местного" много?

Как объяснил Майк Ф, "upvalue" — это внешняя локальная переменная. Эта ошибка часто возникает, когда переменная была объявлена ​​local в предварительном объявлении, а затем объявлена ​​local снова при ее инициализации. Это оставляет объявленную вперед переменную со значением nil. Этот фрагмент кода демонстрирует, что нельзя делать:

 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()

В этом случае удаление local перед foo при его инициализации в f() исправляет пример, т.е.

foo = {}
foo.bar = "Hi!"

Теперь вызов useFoo() даст желаемый результат.

Hi!

person GoojajiGreg    schedule 19.03.2017