《Programming in Lua 3》读书笔记(六)

Part1-7:Iterators and the Gnenric for(迭代器和泛型for)

泛型for
语法形式:
for <var_list> in <exp_list> do
     <body>
end
var_list:一个或多个变量名,以逗号分隔;一般来看也多是一个元素;
exp_list:一个或多个表达式的列表,也是以逗号分隔。一般来看,表达式列表只有一个元素,就是调用一个迭代器。

Iterator and Closure
Lua中的迭代器的作用就是每一次返回一个集合中的下一个元素。结合Lua的Closure实现这一个功能。并提出了factory这个概念

迭代器:
e.g.
--返回t的所有元素
function values (t)
     local i = 0
     return function() i = i + 1 ; return t[i] end  --创建closure,保存i这个非局部变量
end

--打印t的所有值
t = { 10, 20 ,30}
for element in values(t) do
     print(element)
end

--string.find操作
string.find()函数可以直接查找某一个字母,也可以直接按位置查找一个单词
e.g1.
s,e = string.find("hello lua","h")
print(s,e)     --1,1
 

e.g2.
s,e = string.find("hello lua","%w+",1)           --查找第一个单词,注意第二个参数"%w+"
print(s,e)      --1,5

 
string.find()函数是介绍lua的多重返回值的例子,该函数返回两个值,第一个是查找到的元素在字符串中的index值,第二个返回值是该元素结束的index值。例如eg1中返回1,1表示"h"在字符串的第一个位置,结束位置则是1;
eg2中返回第一个参数是1,表示该单词的起始位置,第二个参数5表示该单词的结束位置。

泛型for在循环时,遍历table的两个方法:
for i,v in pairs(a) do               --此处有一个函数next可以替换这里的pairs 语法格式为 v in next,a(注意这里a前面的逗号,这个不能少)
end
for i,v in ipairs(a) do
end
这两个方法有什么区别呢?

关于泛型for和其迭代器,需要再查阅相关的资料

Lua实现list结构,代码:
local function getnext( list,node )
     if not node then
          return list
     else
          return node.next
     end
end

function traverse( list )
     return getnext,list,nil
end

list = nil
for line,in "traverse" do
     list = {val = line,next = list}
end

7.4 Iterator with Complex State
使用table作为state

关于这一章的内容还需要再查阅相关的资料进行进一步的理解,看来直接看英文资料还是有点吃力的。
原文地址:https://www.cnblogs.com/zhong-dev/p/4044580.html