Lua語言元表、協同程序

元表

元表的定義

允許我們改變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;來對節點中的容…