我是Lua的新手并试图将事情分类。我试过这段代码:
function newCarousel(images)
local slideToImage = function()
print("ah!")
end
end
local testSlide = newCarousel(myImages)
testSlide.slideToImage()
这给了我这个错误:
尝试索引本地“testSlide”(零值)...
为什么会这样?
答案 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'(函数值)”。