《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
关于这一章的内容还需要再查阅相关的资料进行进一步的理解,看来直接看英文资料还是有点吃力的。