元表

元表的定义

允许我们改变table的行为。

setmetatable(普通表,元表)-- 元表a = {"a","b","c"} -- 普通表 b = {} --元表c = setmetatable(a,b)print("------------------------")f = {}print("f:",f)d = setmetatable({"c","d"},f)print(d[1])e = getmetatable(d)print("e:",e)

index元方法

__index (两个下划线)定义普通表 p。给普通表p,设置元表y,而元表y中有__index,__index=一个表 i,i中有 我们访问的那个不存在的 key。__index=表print("-------------测试__index---------------") -- 普通表tab1 = {"a","b","c"}print(tab1[5])-- 普通表,有一个元素 5="e" newTab = {}newTab[5] = "e"metaTab1 = {__index=newTab}setmetatable(tab1, metaTab1)print(tab1[5])--index=函数(表,key)-- 普通表tab1 = {"a","b","c"} print(tab1[5])print("原始的tab1:",tab1)metaTab1 = {__index=function(tab, key )print("参数当中的tab:",tab)print("参数当中的key:",key)if(key == 5) thenreturn "index--5" endend}setmetatable(tab1, metaTab1)print(tab1[5])请求表中key的值:先在普通表中找,有返回,没有,看元表。如果元表有__index, 且 __index中有对应的key。 如果没有,继续找__index的function。

newindex元方法

对表进行更新时调用。函数用法print("-----------newindex--------------") mytab2 = {"a","b"}metatab2 = {__newindex = function(tab, key ,value)print("被调用")-- tab[key] = valuerawset(tab,key,value)end}setmetatable(mytab2,metatab2)mytab2[3]="c"print(mytab2[3])表mytab2 = {"a","b"}mytab21 = {} metatab2 = {__newindex = mytab21}setmetatable(mytab2,metatab2)mytab2[3]="c"print(mytab2[3])print(mytab2[3])

为表添加操作符

加法操作print("-------------操作符------------") tab3 = {"1","2"}tab4 = {"a","b","c"}metatab3 = {__add = function(tab1,tab2) local m = #tab1for k,v in pairs(tab2)dom = m+1tab1[m] = vendreturn tab1end}setmetatable(tab3,metatab3)v = tab3 + tab4 print(v)for k,v in pairs(v) doprint(k,v) end__add:+ __sub: - _mul:*   __div: /__mod: %__concat: ..__eq:== __lt: <_le: <=

call元方法

lua中,当表被当成函数调用时,会触发。print("-----------call-------------") tab_a1 = {"a","b"}print("tab_a1原始值:",tab_a1) tab_a2 = {"1","2"}metatab_a = {__call = function(tab, ...)local a = {...}for k,v in pairs(a) doprint(v)endend}setmetatable(tab_a1,metatab_a)result = tab_a1(6,7,8)

tostring

用于修改表的输出行为。类似于java中的toString()。print("-----------call-------------") tab_a1 = {"a","b","c","d"}print("tab_a1原始值:",tab_a1) tab_a2 = {"1","2"}metatab_a = {__call = function(tab, ...)local a = {...}for k,v in pairs(a) doprint(v)endend,__tostring = function(tab)local str = ""for k,v in pairs(tab) dostr = str..v..","return str end}setmetatable(tab_a1,metatab_a) -- result = tab_a1(6,7,8)print(tab_a1)ps:每个元方法之间 用 ,

协同程序

类似于 多线程的概念。

协程和线程的区别:

一个多线程的程序,可以同时运行多个线程。而协程呢,在某个时刻,只有一个协程在运行。 线程由cpu调度,协程由代码调度。

创建协程,并运行:

# 定义协程testAdd = coroutine.create( function(a,b)print(a+b)end)# 启动协程# 原来暂停-》执行,原来执行-》暂停 coroutine.resume(testAdd, 1,2)wrapco = coroutine.wrap(function(a)print("参数值是:"..a)end)co(2)

启动、停止

testAdd = coroutine.create(function(a,b)print("执行--子方法",a+b)coroutine.yield();print("执行--子方法",a-b)end)coroutine.resume(testAdd, 1,7)print("执行主方法")coroutine.resume(testAdd)

返回值

testAdd = coroutine.create(function(a,b)print("协程执行",a+b)coroutine.yield()return a+b,a-b end)r1,r2,r3 = coroutine.resume(testAdd, 1,7)print("返回值:",r1,r2,r3)r1,r2,r3 = coroutine.resume(testAdd, 1,7)print("重新执行,返回值:",r1,r2,r3)

协程状态

testAdd = coroutine.create(function(a,b)print("运行中 协程状态:",coroutine.status(testAdd)) coroutine.yield()return a+b,a-b end)print("刚定义好的协程状态:",coroutine.status(testAdd))r1 = coroutine.resume(testAdd,1,4)print("启动协程结果:",r1)print("最终的 协程状态:",coroutine.status(testAdd))print("yield后 协程状态:",coroutine.status(testAdd))r1 = coroutine.resume(testAdd,1,4)print("二启动协程结果:",r1)print("二最终的 协程状态:",coroutine.status(testAdd))r1 = coroutine.resume(testAdd,1,4)print("三启动协程结果:",r1)结果:刚定义好的协程状态:    suspended运行中 协程状态:       running启动协程结果:  true最终的 协程状态:       suspendedyield后 协程状态:      suspended二启动协程结果:        true二最终的 协程状态:     dead三启动协程结果:        false

协程协作

协程唯一标识testAdd = coroutine.create(function(a,b)print(coroutine.running)print("1") end)coroutine.resume(testAdd,1,1)协程内部和外部协作的例子:-- 协程内外部协作的例子 function foo(a)print("foo 参数:",a)return coroutine.yield(a*2) endco = coroutine.create(function(a,b)print("第一次启动协程,参数:",a,b) local r = foo(a+1)print("第二次启动协程,参数",r)local x,y = coroutine.yield(a+b,a-b)print("第三次启动协程,参数",x,y)return b,"协程结束啦"end)print("主程序:",coroutine.resume(co,1,5))print("----分隔符---")print("主程序:",coroutine.resume(co,"r"))print("----分隔符---")print("主程序:",coroutine.resume(co,"x","y"))print("----分隔符---")print("主程序:",coroutine.resume(co))第一次resume,传入的参数是 function的参数。第一次yield的参数,是第一次resume的返回值。第二次resume的参数,是第一次yield的 返回值。

生产者消费者问题

思路:1。生产者生产完 产品,(自己停下来),等待消费者消费。2。消费者消费完产品,(自己停下来),等待生产者生产。-- 生产者和消费者function productor()-- 定义生产的商品,用数字来替代 local i = 0while i<100doi = i+1print("生产了:",i)-- 通过协程实现coroutine.yield(i) endendfunction consumer() while truedo-- 从生产者获取产品local status,result = coroutine.resume(po) print("消费了:",result)if (result == 99) thenbreakendendend-- 程序开始po = coroutine.create(productor)consumer()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92530.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92530.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92530.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[已解决]VSCode右键菜单消失恢复

前言 莫名其妙,好似VSCode自动更新以后,右键菜单就失效了,重装也无果. 手动搞一个吧 保存下面代码到桌面修复VSCODE右键菜单.reg,双击运行即可. Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]"使用 VSCode 打开""…

什么是浏览器标识?

浏览器标识 层面一&#xff1a;网络层指纹 (HTTP/TLS) 这是最基础的指纹&#xff0c;即使不用浏览器&#xff0c;只用Go的 net/http 发请求也会留下。HTTP Headers (请求头): User-Agent: 最著名的标识&#xff0c;声明自己是什么浏览器。很容易伪造&#xff0c;但也很容易被识…

五十八、【Linux系统nginx服务】nginx代理服务器、nginx优化

Nginx代理技术全景图 #mermaid-svg-0dRktnHYPXypO9xB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0dRktnHYPXypO9xB .error-icon{fill:#552222;}#mermaid-svg-0dRktnHYPXypO9xB .error-text{fill:#552222;stroke…

[0CTF 2016]piapiapia

usernamepassword回显推断admin123Invalid user name or passwordadmin123Invalid user name or passwordadmin123Invalid user name or passworda123Invalid user name说明username是adminadmin1Invalid password这很奇怪了admin0200&#xff1f;admin11Invalid user name or …

人工智能系列(7)人工神经网络中的无监督学习

一. 无监督学习简介神经网络的一个关键属性是能够从环境中学习&#xff0c;并在不断学习的过程中持续改善性能。在无监督学习&#xff08;又称自组织学习&#xff0c;self-organized learning&#xff09;中&#xff0c;网络无需外部教师提供目标输出&#xff0c;而是通过对输入…

250810-OpenWebUI集成Dify应用

A. 最终效果 B. 环境配置 配置并启动Open-WebUI 随后浏览器访问&#xff1a;http://localhost:8080 pip install open-webui open-webui serve配置并启动Pipelines Pipelines默认占用80端口相比于Docker的启动方式&#xff0c;可以在相同的命令行中&#xff0c;查看pipelines …

day22|学习前端ts语言

抽象类&#xff0c;继承。不能创造实例class类&#xff1a;属性声明&#xff0c;构造器&#xff0c;方法&#xff0c;实例继承super&#xff08;&#xff09;override重写父类继承的方法声明提升&#xff08;hoisting&#xff09;同一个js作用域内部&#xff0c;编译阶段把函数…

【网络安全】CTF——[网鼎杯2018]Unfinish-SQL注入-二次注入

目录 一、前言 二、环境 三、复现 3.1寻找注入点 3.2尝试盲注 3.3正则限制 3.4脚本注入获取flag 四、总结 一、前言 前两天复现了一道CTF题目[网鼎杯 2018]Comment&#xff0c;今天继续来学习一下SQL二次注入。 二、环境 BUUCTF在线评测 三、…

【langchain】如何给langchain提issue和提pull request?

什么是issue? 可以这么理解&#xff0c;bug是issue的子集。issue可以包含bug\feature\sercurity and others. https://github.com/langchain-ai/langchain/issues/32484 什么是pull request? 其实我真不是很理解&#xff0c;但不妨我来提pr https://github.com/langchain-ai/…

MySQL的存储引擎:

目录 InooDB引擎&#xff1a; MyISAM引擎&#xff1a; InooDB引擎与MyISAM存储引擎的区别&#xff1a; Archive引擎&#xff1a; Blackhole引擎&#xff1a; CSV引擎&#xff1a; Memory引擎&#xff1a; Federated引擎&#xff1a; Merge引擎&#xff1a; NDB引擎&a…

Mock与Stub

一、核心概念与差异对比特性MockStub核心目的验证对象间的交互行为提供预定义的固定响应验证重点方法调用次数、参数、顺序不关注调用过程&#xff0c;只关注结果行为模拟可编程的智能模拟静态的简单响应适用场景验证协作关系隔离依赖、提供固定数据复杂性较高&#xff08;需要…

香港服务器容器网络插件的多节点通信性能基准测试

香港服务器容器网络插件的多节点通信性能基准测试在云计算和容器化技术快速发展的今天&#xff0c;香港服务器因其优越的地理位置和网络环境&#xff0c;成为众多企业部署容器服务的首选。本文将深入探讨香港服务器环境下容器网络插件的多节点通信性能&#xff0c;通过详实的基…

Vue3 学习教程,从入门到精通,Vue 3 全局 API 语法知识点及案例详解(32)

Vue 3 全局 API 语法知识点及案例详解 Vue 3 提供了丰富的全局 API&#xff0c;用于创建应用实例、注册全局组件、指令、插件等。以下将详细介绍 Vue 3 的主要全局 API&#xff0c;并结合详细的案例代码进行说明。每个案例代码都包含中文注释&#xff0c;帮助初学者更好地理解…

UE5多人MOBA+GAS 41、制作一个飞弹,添加准心索敌

文章目录添加新角色&#xff08;不写了&#xff09;创建一个发射技能创建一个飞弹类添加击中特效添加准星UI获取瞄准目标添加新角色&#xff08;不写了&#xff09; 将原本的机器人蓝图改为BP_PlayerCharacter&#xff0c;以此创建子蓝图 创建动画蓝图模板&#xff08;具体就…

解决渲染抖动与滚动锚点定位不准确问题的方法与经验分享

场景描述&#xff1a;React 虚拟列表&#xff08;Virtualized List&#xff09;是当我们在处理大列表时&#xff0c;为了提升性能而采用的一种技术。然而在实现过程中&#xff0c;可能会遇到渲染抖动问题以及滚动锚点定位不准确的问题。  解决方案&#xff1a;React虚拟列表实…

OpenAI 时隔多年再开源!GPT-OSS 120B/20B 发布,支持本地部署,消费级 GPU 即可运行

OpenAI 近期做出了一项令人瞩目的战略转变&#xff1a;宣布推出两款开放权重&#xff08;Open Weight&#xff09; 语言模型 GPT-OSS-120B 和 GPT-OSS-20B。这不仅是其自 GPT-2 之后首次开源模型&#xff0c;更关键的是&#xff0c;这两款模型特别针对消费级硬件进行了深度优化…

MySQL高可用方案之MySQL Group Replication高可用架构搭建完全指南

MySQL Group Replication高可用架构搭建完全指南 前言 在当今互联网应用中,数据库高可用性已成为系统设计的核心需求。MySQL作为最流行的开源关系型数据库之一,其高可用解决方案备受关注。MySQL Group Replication是MySQL官方推出的原生高可用解决方案,它基于Paxos协议实现…

网站SSL证书到期如何更换?简单完整操作指南

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

Spring Boot 开发三板斧:POM 依赖、注解与配置管理

引言 Spring Boot 是一个功能强大且广受欢迎的框架&#xff0c;用于快速构建基于 Spring 的应用。它通过简化配置和自动化管理&#xff0c;帮助开发者专注于业务逻辑的实现。然而&#xff0c;要想高效地开发 Spring Boot 应用&#xff0c;掌握以下三个关键点至关重要&#xff1…

kubernetes安装搭建

个人博客站—运维鹿:http://www.kervin24.top/ CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 一、kubernetes介绍 Kubernetes本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容…