对lua泛型for迭代器一些理解
2016-07-12 12:26
246 查看
1.w3cschool菜鸟教程中提到:泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。
理解看后面总结
2.对于多状态迭代器
理解看后面总结
3.自定义ipais
理解看下
综上总结一下:
1.我们先理解 for 语句的 意思
for ...(1) in func(2) ...(3) do
end
...(1) 是每次执行参数为...(3)的函数func(2)的返回值,直到返回nil,也就是...(1)整体为nil值时,循环结束
例子
2.理解了for的语义,我们再回头看下例子2
for v in elementIterator({11,22,33}) do
print(v)
end
每次执行elementIterator({11,22,33})的返回值函数(注意,这里是执行elementIterator的返回值(一个函数),并不是执行elementIterator):
也就是每次执行函数
function ()
index = index + 1
if index <= count
then
-- 返回迭代器的当前元素
return collection[index]
end
end
该函数携带参数无,并且可以访问到elementIterator的局部参数 local index = 0 local count = #collection,其返回一个table中的元素,并且存到v中
3.对于例子1 这理解就简单多了
for 循环中 每次执行square函数,该函数携带两个参数iteratorMaxCount,currentNumber,初始化分别为3,0
函数返回两个值分别存到i,v中,直到返回整体为nil,循环结束
4.例子3,其实和例子1大同小异,ipairs (a) 其实是把函数itera,以及itera的参数a,i封装起来了
for i,v in ipairs({111,222,333}) do 等价于
for i,v in iter,{111,222,333},
0 do
5.再点一个,不别太在意 状态常量、控制变量 是什么意思,他们只是迭代函数的参数而已,并且这参数个数可有可无,可多可少,并非就一定得是(状态常量、控制变量)你两个而已
--以下为无状态迭代器 function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end --泛型 for 在自己内部保存迭代函数,实际上它保存三个值: --迭代函数square、状态常量3、控制变量0 for i,n in square,3,0 do print(i,n) end
理解看后面总结
2.对于多状态迭代器
--多状态迭代器 function elementIterator (collection) local index = 0 local count = #collection -- 闭包函数 return function () index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end for v in elementIterator({11,22,33}) do print(v) end
理解看后面总结
3.自定义ipais
function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 end for i,v in ipairs({111,222,333}) do print(i,v) end
理解看下
综上总结一下:
1.我们先理解 for 语句的 意思
for ...(1) in func(2) ...(3) do
end
...(1) 是每次执行参数为...(3)的函数func(2)的返回值,直到返回nil,也就是...(1)整体为nil值时,循环结束
例子
local a = 0 local function pa(b,c) a = a + 1 if a < 5 then return 1,2,3,a else return nil end end for i,j,k,v in pa,1,1 do print(i,j,k,v) end
2.理解了for的语义,我们再回头看下例子2
for v in elementIterator({11,22,33}) do
print(v)
end
每次执行elementIterator({11,22,33})的返回值函数(注意,这里是执行elementIterator的返回值(一个函数),并不是执行elementIterator):
也就是每次执行函数
function ()
index = index + 1
if index <= count
then
-- 返回迭代器的当前元素
return collection[index]
end
end
该函数携带参数无,并且可以访问到elementIterator的局部参数 local index = 0 local count = #collection,其返回一个table中的元素,并且存到v中
3.对于例子1 这理解就简单多了
for 循环中 每次执行square函数,该函数携带两个参数iteratorMaxCount,currentNumber,初始化分别为3,0
函数返回两个值分别存到i,v中,直到返回整体为nil,循环结束
4.例子3,其实和例子1大同小异,ipairs (a) 其实是把函数itera,以及itera的参数a,i封装起来了
for i,v in ipairs({111,222,333}) do 等价于
for i,v in iter,{111,222,333},
0 do
5.再点一个,不别太在意 状态常量、控制变量 是什么意思,他们只是迭代函数的参数而已,并且这参数个数可有可无,可多可少,并非就一定得是(状态常量、控制变量)你两个而已
相关文章推荐
- 设计模式之行为型模式 - 调用行为的传递问题
- Ruby中的迭代器详解
- Ruby中Block和迭代器的使用讲解
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例