您的位置:首页 > 编程语言 > Lua

Lua学习——闭包、迭代器

2013-11-27 10:37 435 查看
copy:http://blog.csdn.net/phenix32/article/details/8961592

--[[

 时间:2013年5月22日11:25:40

 作者:PhoenixCao

 内容:Lua程序练习3

--]]

-- 闭包示例

names = {"Peter","Phoenix","Mary"}

grades = {Mary = 10, Peter = 7, Phoenix = 8}

table.sort(names,function (n1,n2)

 return grades[n1] > grades[n2]

end)

for i = 1, #names do

 print(names[i])

end

--[[ 输出结果

Mary

Phoenix

Peter

--]]

-- 闭包是对值的理解,不是函数

function newCounter()

 local i = 0

 return function()  -- 匿名函数

  i = i + 1

  return i

 end

end

c1 = newCounter()

c2 = newCounter()

print(c1)     -- 函数指针的所在地址

print(c1())     -- 函数的返回值

print(c1())

print(c2())

--[[ 输出结果

function: 0041C060

1

2

1

--]]

-- 迭代器测试

function list_iter(tbl)

 local i = 0

 local n = table.getn(tbl)

 return function()

  i = i + 1

  if i <= n then return tbl[i] end

 end

end

t = {10,20,30}

iter = list_iter(t)

while true do

 local element = iter()   -- 调用其函数

 if element == nil then break end

 print(element)

end

for element in list_iter(t) do

 print(element)

end

--[[ 输出结果

10

20

30

10

20

30

--]]

--[[

function allwords()

 local line = io.read()

 local pos = 1

 return function()

  while line do

   local s,e = string.find(line,"%w+",pos)

   if s then -- 找到了起始位置

    pos = e + 1

    return string.sub(line,s,e)

   else -- 没找到接着找下一行,从头开始

    line = io.read()

    pos = 1

   end

  end

 return nil  -- 文件查找结束

 end

end

for word in allwords() do

 print(word)

end

--]]

--[[ 输入lala la l

输出结果

lala

la

l

--]]

-- 我们要尽量使用无状态的迭代器,因为这样循环的时候由for来保存,

-- 无需要创建对象,花费的代价小,如果不能用无状态的迭代器实现,

-- 应尽可能使用闭包,尽少使用table,因为闭包的代价比创建table要小,

-- 闭包处理速度也比table要快,还可以使用协同来创建迭代器方式。

--(注意:对于for结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)

function iter (a, i)

 i = i + 1

 local v = a[i]

 if v then 

 return i, v  --迭代函数返回2个值  索引与值

 end

end

function ipairs (a) --ipairs lua简单实现

 return iter, a, 0 --返回3个值  迭代函数,状态常量a,控制变量初始值0

end

a = {"one", "two", "three"}

--无状态的迭代器是指不保留任何状态的迭代器,不访问外部函数变量

--因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

for i, v in ipairs(a) do --无状态迭代?  完成迭代功能的是for语句

 print(i, v)

end

--[[ 输出结果

1 one

2 two

3 three

--]]

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua 迭代 闭包 迭代器