lua中的泛型for用法: for i, v in talbe do....end

帮助文档中介绍的和查资料里的都是fori,vinipairs(talbe)do....end或者pairs()等其他迭代函数,这里直接使用table是什么怎么回事?干脆这... 帮助文档中介绍的和查资料里的都是for i, v in ipairs(talbe) do....end或者pairs()等其他迭代函数,这里直接使用table是什么怎么回事?
干脆这样问好了:
table = {123,456,789}
for _,v in table do
print(v)
end
请告诉我,这里的V每次循环是多少?我是直接用的table,不是套用迭代函数。而我所看见的代码也就是这样用的,也别说这是语法错误,人家程序都跑的好好的。
注:不用再解释用ipairs(table)或者pairs(table)或者其他一些迭代函数,in后面需要返回一个迭代函数,这些资料上说明了的我能懂
展开
 我来答
爱军1978
高粉答主

2018-04-12 · 关注我不会让你失望
知道大有可为答主
回答量:193
采纳率:100%
帮助的人:3.2万
展开全部

原因如下:

for i,v in pairs(t) do ... end,这其实只是泛型for的普通用法,for有2种用法
第一种是 for i = 1,10,1 do print(i) end 这种 当计数器用的。


第二种是泛型for,for a,b,c,d,e in fun1(para) do ... end。


等价于,local fun2 = fun1(para),while true do a,b,c,d,e = fun2(), if a then,break else ......(这里就是上面写在do里面的内容) end,这里要求的就是fun1的返回值必须是一个迭代函数 不然就计算不完了。

lua中的泛型for直接使用talbe的原因:

当我在工作中使用lua 进行开发时,发现在lua 中有4种方式遍历一个table ,当然,从本质上来说其实都一样,只是形式不同。

XXX 15. end 前两种是泛型遍历,后两种是数值型遍历。当然你还会说lua 的table 遍历还有很多种方法啊,没错,不过最常见的这些遍历确实有必要弄清楚。

这四种方式各有特点,由于在工作中我几乎每天都会使用遍历table 的方法,一开始也非常困惑这些方式的不同,一段时间后才渐渐明白,这里我也是把自己的一点经验告诉大家,对跟我一样的lua 初学者也许有些帮助(至少当初我在写的时候在网上就找了很久,不知道是因为大牛们都认为这些很简单,不需要说,还是因为我笨,连这都要问)。

准确来说lua 中的table 更加像是C++中的map ,通过Key 对应存储Value ,但是并非顺序来保存key-value 对,而是使用了hash 的方式,这样能够更加快速的访问key 对应的value ,我们也知道hash 表的遍历需要使用所谓的迭代器来进行,同样,lua 也有自己的迭代器,就是上面4种遍历方式中的pairs 和ipairs 遍历。

但是lua 同时提供了按照key 来遍历的方式(另外两种,实质上是一种),正式因为它提供了这种按key 的遍历,才造成了我一开始的困惑,我一度认为lua 中关于table 的遍历是按照我table 定义key 的顺序来的。

yaoyue1019
2012-04-08 · 知道合伙人互联网行家
yaoyue1019
知道合伙人互联网行家
采纳数:804 获赞数:3392
擅长lua脚本 与android前端交互设计

向TA提问 私信TA
展开全部
for i,v in pairs(t) do ... end
这其实只是泛型for的普通用法
for有2种用法
第一种是 for i = 1,10,1 do print(i) end 这种 当计数器用的
第二种是泛型for,for a,b,c,d,e in fun1(para) do ... end
等价于
local fun2 = fun1(para)
while true do
a,b,c,d,e = fun2()
if a then
break
else
......(这里就是上面写在do里面的内容)
end
end
这里要求的就是fun1的返回值必须是一个迭代函数 不然就计算不完了
更多追问追答
追问
干脆这样问好了:
table = {123,456,789}
for _,v in table do
print(v)
end
请告诉我,这里的V每次循环是多少?我是直接用的table,不是套用迭代函数。而我所看见的代码也就是这样用的,也别说这是语法错误,人家程序都跑的好好的。
注:不用再解释用ipairs(table)或者pairs(table)或者其他一些迭代函数,in后面需要返回一个迭代函数,这些资料上说明了的我能懂
追答
v 什么都不是
因为这样的用法是错误的
in后面必须跟迭代函数
你要写的话要用
for _,v in pairs(table) do
print(v)
end
再就是 表名别用table 因为这也算个是个关键表名 虽然你可以这么用
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
w2moon
2012-04-08 · TA获得超过409个赞
知道小有建树答主
回答量:376
采纳率:0%
帮助的人:268万
展开全部
table是lua里的数据类型,比如 t = {"a","b","c"},t就是个table,
用 for i,v in ipairs(t) do print(i,v) end
执行就打印:
1 a
2 b
3 c
追问
我的意思是 ,不用ipairs()函数,直接把t写上去,会是什么情况?自己尝试着编译不出来,但确实又有这种写法
追答
贴人的源码吧,
lua文档,和翻译的字节码里for ... in 后面必须是个函数。
如果in后面真的是table,那就用的不是lua5.1.4了,应该是改了lua翻译字节码的部分。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jeanjml126
2012-04-07 · TA获得超过147个赞
知道答主
回答量:284
采纳率:0%
帮助的人:205万
展开全部
表格
追问
这废话嘛...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式