Lua 两个return问题(关于for迭代)

functionvalues(t)locali=0function()i=i+1returnt[i]endendt={10,20,30}forelementinvalue... function values (t)
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?真是百思不得解。

麻烦各位会的解答下,谢谢了。
展开
 我来答
kwydwuf
推荐于2018-04-11 · TA获得超过7410个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:2006万
展开全部

你的代码貌似不对吧,应该是

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 写,是完全不同的。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式