Lua学习笔记--迭代器和协程(二)

迭代器
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/

你可能感兴趣的:(Lua学习笔记--迭代器和协程(二))