当前位置: 首页 > news >正文

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

Lua 学习笔记之三

  • 高阶话题
    • 迭代
      • 实例代码
      • 有关迭代的描述
    • 协作线程
      • 实例代码
      • 有关协作线程的描述

高阶话题

迭代

实例代码

--迭代
local function enum(array)local index = 1return function()local ret = array[index]index = index + 1return retend
endlocal function foreach(array,action)for element in enum(array)doaction(element)end
endforeach({1,2,3},print)

输出结果

1
2
3

有关迭代的描述

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

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

协作线程

实例代码

--线程
local function producer()return coroutine.create(function(salt)local t = {1,2,3}for i = 1,#t dosalt = coroutine.yield(t[i] + salt)endend)
endfunction consumer(prod)local salt = 10while true dolocal running ,product = coroutine.resume(prod, salt)salt = salt*saltif running thenprint(product or "END!")elsebreakendend
endconsumer(producer())

输出结果

11
102
10003
END!

有关协作线程的描述

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

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

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

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

http://www.lryc.cn/news/341110.html

相关文章:

  • 企业网盘搭建——LNMP
  • Go语言异常处理方式
  • 时序分析基本知识点
  • ELK(Elasticsearch+Logstash+Kibana)日志分析系统
  • 【投稿优惠-EI稳定检索】2024年地理信息技术与遥感测绘国际学术会议(ICGITRSM 2024)
  • MySQL的内外连接
  • Pandas连接MySQL数据库
  • 2024华中杯数学建模参考思路+完整代码+后续成品论文预约
  • ARM_day8:基于iic总线的通信
  • 33、Lua Cocos2d-x使用Luajit实现加密
  • spring 集成 mybatis
  • rtpengine 的端点学习模式
  • Windows 安装 A UDP/TCP Assistant 网络调试助手
  • web自动化系列-selenium的3种等待方式(十一)
  • 每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)
  • web项目中jsp页面不识别el表达式
  • 【Python基础】字典
  • 2024HW --> 安全产品 Powershell无文件落地攻击
  • 力扣哈哈哈哈
  • RUM 最佳实践-视觉稳定性的探索与实践
  • PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑
  • 爬虫开发教程
  • 【Python】高级进阶(专版提升3)
  • LeetCode 1378、1277、2944
  • 【缓存常见问题】
  • Python爬取猫眼电影票房 + 数据可视化
  • Spring Boot深度解析:是什么、为何使用及其优势所在
  • 面向对象——类与对象
  • Golang的[]interface{}为什么不能接收[]int?
  • 重启服务器或重启docker,导致emqx的Dashboard的密码重置为public