25、Lua 学习笔记之三(高阶话题)

Lua 学习笔记之三

高阶话题

迭代

实例代码

lua 复制代码
--迭代
local function enum(array)
    local index = 1
    return function()
        local ret = array[index]
        index = index + 1
        return ret
    end
end

local function foreach(array,action)
    for element in enum(array)do
        action(element)
    end
end

foreach({1,2,3},print)

输出结果

lua 复制代码
1
2
3

有关迭代的描述

  • 定义

    迭代是for语句的一种特殊形式,可以通过for语句驱动迭代函数对一个给定集合进行遍历。正式、完备的语法说明较复杂,请参考Lua手册。

  • 实现

    如前面代码所示:enum函数返回一个匿名的迭代函数,for语句每次调用该迭代函数都得到一个值(通过element变量引用),若该值为nil,则for循环结束。

协作线程

实例代码

lua 复制代码
--线程
local function producer()
    return coroutine.create(
    function(salt)
        local t = {1,2,3}
        for i = 1,#t do
            salt = coroutine.yield(t[i] + salt)
        end
    end
    )
end

function consumer(prod)
    local salt = 10
    while true do
        local running ,product = coroutine.resume(prod, salt)
        salt = salt*salt
        if running then
            print(product or "END!")
        else
            break
        end
    end
end

consumer(producer())

输出结果

lua 复制代码
11
102
10003
END!

有关协作线程的描述

  • 创建协作线程

    通过coroutine.create可以创建一个协作线程,该函数接收一个函数类型的参数作为线程的执行体,返回一个线程对象。

  • 启动线程

    通过coroutine.resume可以启动一个线程或者继续一个挂起的线程。该函数接收一个线程对象以及其他需要传递给该线程的参数。线程可以通过线程函数的参数或者coroutine.yield调用的返回值来获取这些参数。当线程初次执行时,resume传递的参数通过线程函数的参数传递给线程,线程从线程函数开始执行;当线程由挂起转为执行时,resume传递的参数以yield调用返回值的形式传递给线程,线程从yield调用后继续执行

  • 线程放弃调度

    线程调用coroutine.yield暂停自己的执行,并把执行权返回给启动/继续它的线程;线程还可利用yield返回一些值给后者,这些值以resume调用的返回值的形式返回。

参考文献《C/C++程序员的Lua快速入门》

相关推荐
RickyWasYoung1 小时前
【笔记】智能汽车、电动汽车政策文件
笔记·汽车
Ma0407132 小时前
【机器学习】监督学习、无监督学习、半监督学习、自监督学习、弱监督学习、强化学习
人工智能·学习·机器学习
小熊officer2 小时前
Nginx学习
运维·学习·nginx
秋邱2 小时前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
Three~stone2 小时前
Matlab2025b的安装教程(附安装包和密钥破解文件)
学习·mysql·持续部署
爱学习的大牛1233 小时前
如何系统学习网络渗透测试:从入门到精通的完整指南
网络·学习
落子摘星3 小时前
suricata学习杂记(一)
学习·modbus·suricata·pdu
charlie1145141914 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
white-persist4 小时前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
love530love4 小时前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar