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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua中的泛型for用法: for i, v in talbe do....end相关的知识,希望对你有一定的参考价值。

帮助文档中介绍的和查资料里的都是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后面需要返回一个迭代函数,这些资料上说明了的我能懂

原因如下:

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 的顺序来的。

参考技术A 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 因为这也算个是个关键表名 虽然你可以这么用

追问

这位兄弟,我已经说了,人家源码就是这么写的,那块脚本的程序也跑的很正常,显然这么用没问题,而我用table也只是个伪代码,方便识别,希望回答者能提供些有用的信息,万分感激

追答

前面那句话已经和你说过了
for xxxx in x do ... end 后面的x是一个迭代函数
明显这里的x就已经不是一个表了 可以是一个函数
所以你这时候应该考虑在in后面的那个值是不是存在元表的情况
或是这个值就是一个迭代函数的情况
function iter()
local v = 1
return function()
if v < 5 then
v = v + 1
return v
else
return nil
end
end
end

Iter = iter()
for v in Iter do
print(v)
end
很好的案例 说明了你的情况 当然 迭代函数可以改成其他内容
至于使用元表的部分 懒得回答了 你问了这么多问题 但是悬赏分依然是0 完全看不出你的诚意
还有就是 注意一下你说话的语气 大家都是热心网友才帮你免费回答问题
不是欠你钱也不是欠你恩 希望你能对为你详细回答的每一位网友抱有一颗感恩的心

追问

好吧,我直接上源码了,这是部分源码,别再说in后面是迭代函数了

--所拥有的事件ID列表
x002023_g_eventList=210200,210201
for i, eventId in x002023_g_eventList do
......
end

追答

你没考虑到x002023_g_eventList 存在元表的情况

本回答被提问者采纳
参考技术B 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翻译字节码的部分。

参考技术C 表格追问

这废话嘛...

v-for的四种用法

参考技术A

用法 :使用v-for="item in list"的写法,依次取出list中的所有item,或者使用v-for="(item,i) in list",依次取出list中的所有item和它们对应的索引i

用法 :使用v-for="user in list ",依次取出list中的每个对象user,或者使用v-for="(user,i) in list",依次取出list中的每个对象和它们对应的索引

用法 :使用v-for="(val,key) in list",依次取出list中的每个对象的键和值,或者使用v-for="(val,key,i) in list",依次取出list中的每个对象的键,值和索引

用法 :使用v-for="count in 10",迭代次数将从1开始,一直迭代至10

以上是关于lua中的泛型for用法: for i, v in talbe do....end的主要内容,如果未能解决你的问题,请参考以下文章

Java中的泛型

Java基础之Java中的泛型

C# 中的泛型与非泛型性能

Lua 迭代器

Lua中的generic for

forEach,for in,for of循环的用法