你现在得到的代码,如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)。接下来,它从本地表 (testSlide) 中获取 slideToImage 值。这里的问题是testSlide 不是表,而是nil。这是您的错误消息的来源。请注意,这不是唯一的错误,但它是运行时看到的第一个错误,也是导致一切阻塞的原因。如果你从newCarousel 返回了一个实际的函数,你会得到一个不同的错误。例如,如果我将行 return slideToImage 添加到 newCarousel 函数,则错误消息将是“尝试索引本地 'testSlide'(函数值)”。