Lua 两个return问题(关于for迭代)
local i = 0
function() i = i + 1return t[i] end
end
t = {10, 20, 30}
for element in values(t) do
print(element)
end
输出是:10 20 30
问1:第三行这里的两个return是什么意思,为什么两个都会执行的?
问2: function() i = i + 1 又是什么意思?
我是初学者,不理解Lua 中 return的原理,按C*这类语言,不是return了之后,就退出函数了吗,为什么Lua的renturn后面却还能return?真是百思不得解。
麻烦各位会的解答下,谢谢了。 展开
你的代码貌似不对吧,应该是
function values (t)
local i = 0
return function() i = i + 1; return t[i] end
end
t = {10, 20, 30}
for element in values(t) do
print(element)
end
简单的说, 函数values 的返回值是一个另外一个匿名函数,其内容为 function () i = i + 1; return t[i] end
并且这个匿名函数本身又是一个闭包 (closure),因为在这个函数中使用了外层的数据,即 i 和 t, i 和 t 是 values 函数里的局部变量,被那个匿名函数使用,所以匿名函数和 t, i 组成了闭包。
a = values(t) ,则 a 为一个闭包函数,初始状态下,闭包中的 i 为 0, t 为传入的 t (即 {10, 20, 30}),如果你用 a() 的方法调用这个闭包函数,则会茄游执行匿名函数中的内容,即 i 增加1, 并返回 t[i],因此下面的代码效果为:
a = values(t)
a() -- 返回 t[1], 即 10
a() -- 返回 t[2], 即 20
a() -- 返回 t[3], 即 30
a() -- 超过 t 长度,返回 nil
for element in values(t) 这一句就相当于
a = values(t)
for 喊喊element in a
而lua中 for xxx in yyy 语句就相当于 不断的让 xxx 等于 yyy(),然后执行后面的语句,直到 yyy() 返回 nil 为止。 【当然实际上 for xxx in yyy 实际做的动作更加复杂,这里只是最简单的一种说法,方便你理解】,所以上面的 for element in a 就相当于不断的让 element = a(),直到 a() 返回 nil。
这样你应该就可以理解整段代码了。
在 C 中是完全不存在闭包(closure), 匿名函数 (anonymous function) 的概念的,所颤渗销以你不能用 C 的思想去完全理解 lua 和其他高级语言中的新概念的。建议你找本 lua 的书再仔细看看,总之,用 lua/python 这类高级语言写程序和用 C 写,是完全不同的。