'尝试索引upvalue'的含义是什么?

时间:2008-10-12 15:02:01

标签: lua upvalue

我正在使用Lua编程的第一步,并在运行脚本时遇到此错误:

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

这可能是由于我尚未掌握的非常基本的东西,但在谷歌搜索时我找不到任何有关它的好信息。有人可以向我解释这是什么意思吗?

2 个答案:

答案 0 :(得分:13)

在这种情况下,它看起来base是一个函数,但您尝试将其编入索引(例如。base[5]base.somefield)。

'upvalue'部分只是告诉你变量base是什么类型,在这种情况下是一个upvalue(也就是外部局部变量)。

答案 1 :(得分:5)

一个“本地”太多了?

正如Mike F所解释的那样,“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!" 会修复示例,即

{
 "colors": [
  {
   "name": "Red",
   "thumb": "/imgs/redthumb.png",
   "largeimg": "/imgs/redlarge.png"
  },
  {
   "name": "Blue",
   "thumb": "/imgs/bluethumb.png",
   "largeimg": "/imgs/bluelarge.png"
  }
 ]
 }

现在调用useFoo()将产生所需的输出

  

嗨!