迭代器
function iterator(tab)
local i=0
return function()
i=i+1;
return tab[i]
end
end
t={10,20,30}
it=iterator(t)
while true do
local element=it()
if element==nil then break end
print(element)
end
--另外一种调用方式
for element in iterator(t) do
print(element)
end
协程
--相当于创建了Runnable对象
co=coroutine.create(
function()
print("hello world")
end
)
--对象创建之后,协程的状态是挂起,并没有运行
print(coroutine.status(co))
--运行程序.
coroutine.resume(co)
已经运行完成的协程,是死亡状态,不能再次运行.
但是yield可以将程序由运行状态,转为挂起状态.
co=coroutine.create(
function()
for i=1,3 do
print("co",i)
coroutine.yield()
end
end
)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
coroutine.resume(co)
[nginx@localhost~]$./lua_test.lua
suspended
co 1
suspended
co 2
co 3
管道
function receive()
local status,value=coroutine.resume(producer)
print("receive:"..value)
return value
end
function send(x)
print("send:"..x)
coroutine.yield(x)
end
producer=coroutine.create(
function()
while true do
local x=io.read()
send(x)
end
end
)
consumter=coroutine.create(
function()
while true do
local x=receive()
io.write(x,"\n")
end
end
)
coroutine.resume(consumter)
过滤器
function receive(prod)
local status,value=coroutine.resume(prod)
return value
end
function send(x)
coroutine.yield(x)
end
function producer()
return
coroutine.create(
function()
while true do
local x=io.read()
send(x)
end
end
)
end
function filter(prod)
return coroutine.create(function()
for line=1,math.huge do
local x=receive(prod)
x=string.format("%5d: %s",line,x)
send(x)
end
end
)
end
function consumter(prod)
while true do
local x=receive(prod)
io.write(x,"\n")
end
end
p=producer()
f=filter(p)
consumter(f)
function iterator(tab)
local i=0
return function()
i=i+1;
return tab[i]
end
end
t={10,20,30}
it=iterator(t)
while true do
local element=it()
if element==nil then break end
print(element)
end
--另外一种调用方式
for element in iterator(t) do
print(element)
end
协程
--相当于创建了Runnable对象
co=coroutine.create(
function()
print("hello world")
end
)
--对象创建之后,协程的状态是挂起,并没有运行
print(coroutine.status(co))
--运行程序.
coroutine.resume(co)
已经运行完成的协程,是死亡状态,不能再次运行.
但是yield可以将程序由运行状态,转为挂起状态.
co=coroutine.create(
function()
for i=1,3 do
print("co",i)
coroutine.yield()
end
end
)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
coroutine.resume(co)
[nginx@localhost~]$./lua_test.lua
suspended
co 1
suspended
co 2
co 3
function receive()
local status,value=coroutine.resume(producer)
print("receive:"..value)
return value
end
function send(x)
print("send:"..x)
coroutine.yield(x)
end
producer=coroutine.create(
function()
while true do
local x=io.read()
send(x)
end
end
)
consumter=coroutine.create(
function()
while true do
local x=receive()
io.write(x,"\n")
end
end
)
coroutine.resume(consumter)
过滤器
function receive(prod)
local status,value=coroutine.resume(prod)
return value
end
function send(x)
coroutine.yield(x)
end
function producer()
return
coroutine.create(
function()
while true do
local x=io.read()
send(x)
end
end
)
end
function filter(prod)
return coroutine.create(function()
for line=1,math.huge do
local x=receive(prod)
x=string.format("%5d: %s",line,x)
send(x)
end
end
)
end
function consumter(prod)
while true do
local x=receive(prod)
io.write(x,"\n")
end
end
p=producer()
f=filter(p)
consumter(f)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1850026/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29254281/viewspace-1850026/