“尝试索引本地...”为什么我收到此错误?

时间:2011-05-19 05:06:48

标签: lua corona

我是Lua的新手并试图将事情分类。我试过这段代码:

function newCarousel(images) 
    local slideToImage = function() 
        print("ah!")
    end
end


local testSlide = newCarousel(myImages)
testSlide.slideToImage()

这给了我这个错误:

  

尝试索引本地“testSlide”(零值)...

为什么会这样?

3 个答案:

答案 0 :(得分:7)

由于newCarousel不返回任何内容,因此testSlide为零,因此当您尝试对其进行索引时(testSlide.slideToImage完全等同于testSlide["slideToImage"]),您会收到错误。< / p>

我建议阅读Programming in Lua。您可以通过反复试验来计算语言的语法,语义和习语,但这会花费你更长的时间。

答案 1 :(得分:4)

如果您希望能够执行testSlide.slideToImage(),则必须修改newCarousel,以便它返回一个包含函数的表。最简单的实现如下:

function newCarousel(images)
    local t = {}
    t.slideToImage = function() 
        print("ah!")
    end
    return t
end

你甚至可以构建t并在一步中返回它;以下代码等同于上面的代码:

function newCarousel(images)
    return {
        slideToImage = function() 
            print("ah!")
        end
    }
end

答案 2 :(得分:3)

您现在获得的代码Mud stated不会返回任何内容。 (这不是Scheme或Ruby之类,其中最后一个表达式是返回值。)此外,您似乎认为newCarousel是一个对象。事实并非如此。这是一个功能。当你完成调用newCarousel后,它就结束了。它完成了它的工作,无论它是什么(在你的情况下创建一个迅速删除并返回nil的局部变量。)

正确的代码看起来更像是:

function newCarousel(images) 
    return function() 
        print("ah!")
    end
end

local testSlide = newCarousel(myImages)
testSlide()

这里我现在newCarousel创建一个(匿名)函数并立即返回它。这个匿名函数绑定到testSlide,所以只要testSlide保留在范围内,我就可以随时调用它。


在使用Lua时查看生成的代码是有益的。首先让我们看一下luac为您的代码制作的内容:

main <junk.lua:0,0> (8 instructions, 32 bytes at 0xeb6540)
0+ params, 2 slots, 0 upvalues, 1 local, 3 constants, 1 function
    1   [5] CLOSURE     0 0 ; 0xeb6720
    2   [1] SETGLOBAL   0 -1    ; newCarousel
    3   [7] GETGLOBAL   0 -1    ; newCarousel
    4   [7] GETGLOBAL   1 -2    ; myImages
    5   [7] CALL        0 2 2
    6   [8] GETTABLE    1 0 -3  ; "slideToImage"
    7   [8] CALL        1 1 1
    8   [8] RETURN      0 1

function <junk.lua:1,5> (2 instructions, 8 bytes at 0xeb6720)
1 param, 2 slots, 0 upvalues, 2 locals, 0 constants, 1 function
    1   [4] CLOSURE     1 0 ; 0xeb6980
    2   [5] RETURN      0 1

function <junk.lua:2,4> (4 instructions, 16 bytes at 0xeb6980)
0 params, 2 slots, 0 upvalues, 0 locals, 2 constants, 0 functions
    1   [3] GETGLOBAL   0 -1    ; print
    2   [3] LOADK       1 -2    ; "ah!"
    3   [3] CALL        0 2 1
    4   [4] RETURN      0 1

在您的代码中,主线创建一个闭包,将其绑定到名称newCarousel,获取该值,获取myImages的值并进行调用。这相当于local testSlide = newCarousel(myImages)。接下来,它从本地表(slideToImage)获取testSlide值。这里的问题是testSlide不是表格,而是nil。这是您的错误消息来自的地方。请注意,这不是唯一的错误,但它是运行时看到的第一个错误,也是让一切都窒息的原因。如果您从newCarousel返回了实际函数,则会出现其他错误。例如,如果我将行return slideToImage添加到newCarousel函数,则错误消息将是“尝试索引本地'testSlide'(函数值)”。