Lua_利用闭合函数实现迭代器

c = a or b
若a为真,c = a ;a为假, c = b。
c = a and b
若a为真,c = b;a为假, c = nil

a = 10
b = 20
c = a or b
d = a and b
print(c) 
print(d)

10
20

闭合函数:
一个函数包含另一个函数的调用,内部函数使用外部函数中的变量,生命周期延长

function func1()
    local num = 1
    return function ()  --返回函数
        num = num + 1
        return num
    end
end

local f = func1() --获取返回的函数
local n = f()   --再调用这个函数,获取返回值
print(n)
local n = f()  --num等于上一个num直接加1
print(n)

>>2
>>3

非全局函数:
存储在局部变量中的函数称为非全局函数

--非全局函数:存储在局部变量中的函数称为非全局函数
local eat
local drink
eat = function( ... )
    print("吃")
    drink() --前面不声明直接调用会报错,调用不到
end
drink = function()
    print("喝")
end
eat()

>>吃
>>喝

函数的尾调用:
一个函数的调用是另外一个函数的最后一个动作,上面代码eat方法里最后调用drink函数就是一个尾调用

-利用闭合函数是些迭代器:
function DieDai(t)
    local i = 0
    return function()
        i = i + 1
        return t[i]
    end
end

t = {'11', '22', '33', '44'}
--访问1
local it = DieDai(t)
while true do
    local value = it()
    if value == nil then
        break
    end
    print(value)
end
-- 访问2
for value in DieDai(t) do
    print(value)
end

实现ipair迭代器

function DieDai(t)
    local i = 0
    return function()
        i = i + 1
        if i > #t or t[i] == nil then
            return nil
        end
        return i, t[i]
    end
end
--调用
t = {"一", "二", "三"}
for k, v in DieDai(t) do
    print(k .. '\t' .. v)
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容