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

Lua闭包的使用以及需要注意的问题

1. 闭包的基本概念

在 Lua 中,闭包是一个函数值,它包含了函数本身以及该函数所创建时的环境。闭包允许函数访问其外部函数作用域中的变量,即使外部函数已经执行完毕。

2.闭包的简单使用

代码:在下面的代码中,createCounter函数内部定义了一个局部变量count,并返回了一个匿名函数。这个匿名函数就是一个闭包,它可以访问并修改createCounter函数作用域中的count变量。每次调用counter闭包时,count的值都会增加。

-- 定义一个返回闭包的函数
function createCounter()local count = 0-- 闭包函数return function()count = count + 1return countend
end-- 创建一个闭包实例
local counter = createCounter()-- 多次调用闭包
print(counter())  -- 输出: 1
print(counter())  -- 输出: 2
print(counter())  -- 输出: 3

结果:

3.多个闭包共享外部变量示例

代码:在下面的代码中,createMultiCounters 函数返回了两个闭包 counter1 和 counter2,它们共享外部函数作用域中的 sharedValue 变量。因此,一个闭包对 sharedValue 的修改会影响另一个闭包。

function createMultiCounters()local sharedValue = 0local counter1 = function()sharedValue = sharedValue + 1return sharedValueendlocal counter2 = function()sharedValue = sharedValue + 2return sharedValueendreturn counter1, counter2
endlocal c1, c2 = createMultiCounters()
print(c1())  -- 输出: 1
print(c2())  -- 输出: 3
print(c1())  -- 输出: 4

结果:

4.使用闭包需要注意的问题

1. 变量生命周期

闭包会延长其外部变量的生命周期。即使外部函数已经执行完毕,只要闭包仍然存在,外部变量就不会被销毁。这可能会导致内存泄漏,特别是在创建大量闭包或者闭包持有大对象时。

代码:

function createLargeClosure()local largeTable = {}for i = 1, 100000 dolargeTable[i] = iendreturn function()return #largeTableend
endlocal closure = createLargeClosure()
-- 此时 largeTable 不会被垃圾回收,因为闭包仍然引用它

2. 闭包中的变量捕获

闭包捕获的是变量本身,而不是变量的值。这意味着如果外部变量的值发生改变,闭包中访问该变量时会得到最新的值。

代码:每个闭包都捕获了同一个变量i。当循环结束时,i的值为 4,所以每个闭包返回的值都是 4。如果需要闭包捕获不同的值,可以使用一个额外的函数来创建闭包:

local functions = {}
for i = 1, 3 dofunctions[i] = function()return iend
endfor j = 1, 3 doprint(functions[j]())  -- 输出: 4 4 4
end

更改后的代码:

local functions = {}
for i = 1, 3 dofunctions[i] = (function(value)return function()return valueendend)(i)
endfor j = 1, 3 doprint(functions[j]())  -- 输出: 1 2 3
end

3. 性能开销

1.函数调用开销:闭包的函数调用通常比普通函数调用有更多的开销,因为它需要额外的操作来访问被捕获的变量。如果在性能敏感的代码中频繁使用闭包,可能会影响程序的性能。

2.内存占用:每个闭包都会创建一个新的环境,用于存储被捕获的变量。如果创建了大量的闭包,可能会导致内存占用过高。例如,在一个循环中创建大量闭包:

4. 闭包的共享与并发问题

如果多个闭包共享同一个外部变量,并且在并发环境中使用,可能会导致数据竞争和不一致的问题。在多线程或者协程环境中使用闭包时,需要进行适当的同步操作。例如,可以使用互斥锁来保护共享变量。

代码:下面的代码使用 mutex 来确保对 sharedValue 的访问是线程安全的。

local mutex = require("mutex")()
local sharedValue = 0local function increment()mutex:lock()sharedValue = sharedValue + 1mutex:unlock()return sharedValue
endlocal function decrement()mutex:lock()sharedValue = sharedValue - 1mutex:unlock()return sharedValue
end

相关文章:

Lua闭包的使用以及需要注意的问题

1. 闭包的基本概念 在 Lua 中,闭包是一个函数值,它包含了函数本身以及该函数所创建时的环境。闭包允许函数访问其外部函数作用域中的变量,即使外部函数已经执行完毕。 2.闭包的简单使用 代码:在下面的代码中,create…...

【个人开发】deepseed+Llama-factory 本地数据多卡Lora微调

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.4 微调脚本 2.3 踩坑经验2.3.1 问题一:ValueError: Undefined dataset xxxx in dataset_info.json.2.3.2 问题二: ValueError: Target…...

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源,其储量丰富,预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性,天然气水合物的探测面临诸多挑战,涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…...

VisualStudio 2012 fatal error C1083: 无法打开包括文件:“stdio.h 找不到 sdkddkver.h

今天安装了一个VC 2012 Express 学习版,提示找不不到stdio.h, 提示找不到sdkddkver.h 发现是没有安装windows8.0 SDK ,还有一个些VC头文件没有安装. 真是太奇怪了,可能版本太多,安装出问题. 我这里放一个备份文件,省得以后,不能安装的时候,没地方找这些头文件. 无法打开包…...

什么是access token和refresh token?

access token 验证身份有效时间相对refresh token 时间短一点 refresh token 用于辅助access token 过期,避免用户反复登录的问题当accesstoken过期直接拿refreshtoken去获取最新的token...

盛铂科技 SCP4006/4018/4040:国产袖珍式功率计 射频微波功率探头 平均功率计

在通信、电子测量等领域,功率计是确保信号稳定、系统高效运行的关键设备。盛铂科技自主研发的 SCP4000 系列自带 USB 接口的袖珍式 CW 信号平均功率计,以其卓越的性能、高性价比和便捷的操作,在众多同类产品中脱颖而出,成为行业内…...

Unity 获取独立显卡数量

获取独立显卡数量 导入插件包打开Demo 运行看控制台日志 public class GetGraphicCountDemo : MonoBehaviour{public int count;// Start is called before the first frame updatevoid Start(){count this.GetIndependentGraphicsDeviceCount();}}...

wx061基于ssm+vue+uniapp的疫情期间学生请假与销假系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...

硕成C语言22【一些算法和数组的概念】

1.求水仙花数 #include <stdio.h>int main() {//求水仙花数&#xff1a;1.三位数 2.个位的立方十位的立方百位的立方该数int unit, tens, hundreds;for (int i 100; i < 1000; i)//i表示该水仙花数{unit i / 1 % 10;tens i / 10 % 10;hundreds i / 100 % 10;if (…...

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…...

Django中实现简单易用的分页工具

如何在Django中实现简单易用的分页工具&#xff1f;&#x1f4da; 嗨&#xff0c;小伙伴们&#xff01;今天我们来看看如何在 Django 中实现一个超简单的分页工具。无论你是在处理博客文章、产品列表&#xff0c;还是用户评论&#xff0c;当数据量一大时&#xff0c;分页显得尤…...

个人下载中国生物医学文献服务系统SinoMed文献的途径及操作方法

中国生物医学文献服务系统——SinoMed数据库介绍&#xff1a; 中国生物医学文献服务系统——SinoMed&#xff0c;由中国医学科学院医学信息研究所/图书馆研制&#xff0c;整合了中国生物医学文献数据库&#xff08;CBM&#xff09;、中国医学科普文献数据库&#xff08;CPM&am…...

软件开发 | GitHub企业版常见问题解读

什么是GitHub企业版&#xff1f; GitHub企业版是一个企业级软件开发平台&#xff0c;专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案&#xff0c;GitHub企业版使组织能够无缝集成其他工具和功能&#xff0c;并根据特定需求定制开发环境&#xff0c;提高整体…...

【Bluedroid】BLE连接过程详解

在BLE通信中,广播(Advertising)和扫描(Scanning)是设备发现和建立连接的基本过程。根据蓝牙SPEC,当一个设备(称为Advertiser)在广播模式下发送广播包时,它遵循一定的时序和规则,以便其他设备(称为Observer或Scanner)可以检测到它,并在适当的时机发送连接请求。 B…...

清影2.0(AI视频生成)技术浅析(二):自然语言处理

清影2.0(AI视频生成)中的自然语言处理(NLP)技术是其核心组件之一,负责将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指导后续的视频生成过程。 一、基本原理 1. 目标 清影2.0的NLP技术旨在将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指…...

Bob the Canadian

1&#xff1a;around the house Hi! Bob the Canadian here! Let’s learn English around the house. Come on in! Hi, Bob the Canadian here. Welcome to this video. If this is your first time here, don’t forget to click the subscribe button below, and give…...

DeepSeek、Kimi、文心一言、通义千问:AI 大语言模型的对比分析

在人工智能领域&#xff0c;DeepSeek、Kimi、文心一言和通义千问作为国内领先的 AI 大语言模型&#xff0c;各自展现出了独特的特点和优势。本文将从技术基础、应用场景、用户体验和价格与性价比等方面对这四个模型进行对比分析&#xff0c;帮助您更好地了解它们的特点和优势。…...

算法思考:非0整数除法

这是一道很简单的问题&#xff0c;但是我们可以有更多的思考 1.如何提升效率&#xff1f; 除法&#xff0c;很明显就是循环嘛&#xff0c;那么如何进一步提升效率&#xff1f;就是跳过多余的循环步骤比如15/2&#xff0c;原先是1111111再余1&#xff0c;现在尽量每次除2的最大…...

服务器租用:虚拟化技术都包含哪些内容?

服务器作为常见的网络设备&#xff0c;有着物理服务器、云服务器和虚拟服务器等多种类型&#xff0c;其中虚拟服务器主要是依靠虚拟化技术将物理服务器划分成多个虚拟机&#xff0c;以此来充分利用服务器资源&#xff0c;那虚拟化技术都包含了哪些内容呢&#xff1f; 硬件虚拟化…...

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好&#xff0c;我是老师&#xff0c;看到一个不错的SpringBoot公益众筹爱心捐赠系统&#xff0c;分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前&#xff0c;当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及&#xff0c;本文旨在探讨公益事业…...

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…...

类与对象C++详解(上)

目录 1.类的定义 1.1 类定义格式 补充: struct与class的区别&#xff08;c语言与c&#xff09; 1.2 访问限定符 1.3 类域 2.实例化 3.对象大小 4.this指针 1.类的定义 1.1 类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&…...

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?

对SpringBoot的Web应用做单元测试时&#xff0c;一般会使用spring-boot-test&#xff0c;pom.xml中会添加如下内容&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D&#xff0c;函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…...

家里WiFi信号穿墙后信号太差怎么处理?

一、首先在调制解调器&#xff08;俗称&#xff1a;猫&#xff09;测试网速&#xff0c;网速达不到联系运营商&#xff1b; 二、网线影响不大&#xff0c;5类网线跑500M完全没问题&#xff1b; 三、可以在卧室增加辅助路由器&#xff08;例如小米AX系列&#xff09;90~200元区…...

C++初阶——简单实现string

简单实现std::string类及一些常用的成员函数。 迭代器&#xff0c;使用指针简单代替。 目录 1、String.h 2、String.cpp 3、Test.cpp 1、String.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include <iostream> #include <assert.h>using namespace s…...

浏览器支持的通讯协议

浏览器支持的通讯协议 1. HTTP&#xff08;HyperText Transfer Protocol&#xff09; 版本 HTTP/1.0&#xff1a;每次请求都需要重新建立连接。HTTP/1.1&#xff1a;支持持久连接&#xff08;Keep-Alive&#xff09;&#xff0c;减少连接开销。HTTP/2&#xff1a;多路复用&am…...

18.Python实战:实现年会抽奖系统

目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…...

微信小程序地图标记点,安卓手机一次性渲染不出来的问题

问题描述&#xff1a; 如果微信小程序端&#xff0c;渲染的标记物太多&#xff0c;安卓手机存在标记物不显示的问题&#xff0c;原因初步判断是地图还没有渲染完&#xff0c;标记物数据已经加载完了&#xff0c;导致没有在地图上显示。 解决办法&#xff1a; 使用map组件的b…...

机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确

在大多数情况下&#xff0c;从英语翻译成日语会比从中文翻译成日语更准确&#xff0c;原因如下&#xff1a; 1. 语言结构的相似性 英语和日语的句子结构更接近&#xff0c;特别是在语法、从句使用、定语位置等方面。例如&#xff0c;日语和英语都使用 SVO 结构&#xff08;主…...

ROS基本功能

1.Topic话题与Message消息&#xff08;主要通讯方式&#xff09; 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...

C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析

博主将从C标准库中的 std::string 出发&#xff0c;详细探讨字符串的处理方法&#xff0c;涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开&#xff0c;结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…...

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…...

sql语句的执行顺序

完整的sql语句执行顺序 SELECT DISTINCT column1, column2, aggregate_function(column3) FROM table1JOIN table2 ON table1.column table2.column WHERE condition GROUP BY column1, column2 HAVING group_condition ORDER BY column1, column2 LIMIT offset, count;FROM子…...

更高效实用 vscode 的常用设置

VSCode 可以说是文本编辑神器, 不止程序员使用, 普通人用其作为文本编辑工具, 更是效率翻倍. 这里分享博主对于 VSCode 的好用设置, 让 VSCode 如虎添翼 进入设置 首先进入设置界面, 后续都在这里进行配置修改 具体设置 每项配置通过搜索关键字, 来快速定位配置项 自动保存…...

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建&#xff0c;即 src\app\globals.css&#xff0c;可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…...

铁塔电单车协议对接电单车TCP json协议对接成熟充电桩系统搭建低速充电桩TCP 接口规范

低速充电桩 TCP 接口规范 2019 年 9 月 10 日 目录 低速充电桩 1 2) 概述 2 • 协议服务器(IOT_Server) 6 • 通讯报文原则 6 • 报文协议说明 6 报文中所有数值类型为十进制&#xff1b; 6报文中不允许使用转义字符&#xff0c;如\n、\t、\r、\s&#xff1b; 6 • 报文类型…...

CTF-web:java-h2 堆叠注入rce -- N1ctf Junior EasyDB

代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...

【异或数列——博弈论】

题目 思路 异或和为0&#xff08;即每一位都有偶数个1&#xff09;&#xff1a;平局最高有效位只有唯一的1&#xff1a;先手必胜最高有效位有奇数个1&#xff0c;偶数个0&#xff1a;先手必胜 若先选1产生优势&#xff0c;则剩下偶数个1&#xff0c;偶数个0&#xff1a;对手选…...

2024 年 9 月青少年软编等考 C 语言三级真题解析

目录 T1. 爆气球思路分析T2. 乘法小宇宙思路分析T3. 有多少坑思路分析T4. 势均力敌思路分析T5. 买地攻略思路分析T1. 爆气球 爆气球对孩子们来说是很好玩的游戏。假设有 n n n 只气球被布置在一条直线上,游戏的目标很简单,就是爆掉尽可能多的气球。但是这里我们加一条特殊的…...

JavaScript设计模式 -- 外观模式

在实际开发中&#xff0c;往往会遇到多个子系统协同工作时&#xff0c;直接操作各个子系统不仅接口繁琐&#xff0c;还容易导致客户端与内部实现紧密耦合。**外观模式&#xff08;Facade Pattern&#xff09;**通过为多个子系统提供一个统一的高层接口&#xff0c;将复杂性隐藏…...

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm&#xff1a;确保已安装 Node.js 和 npm。 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个…...

《安富莱嵌入式周报》第350期:Google开源Pebble智能手表,开源模块化机器人平台,开源万用表,支持10GHz HRTIM的单片机,开源CNC控制器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1YPKEeyEeM/ 《安富莱嵌入式周报》第350期&#xff1a;Google开…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种&#xff0c;一种是继承Thread&#xff0c;一种是实现Runable 在这里推荐使用实现Runable接口&#xff0c;因为java是单继承的&#xff0c;一个类继承了Thread将无法继承其他的类&#xff0c;而java可以实现多个接口&#xff0…...

C++ Primer 函数重载

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

10bit VS 8bit 视频:色彩深度的较量,谁才是视觉盛宴的王者?

10bit 和 8bit 视频 10bit 视频和 8bit 视频的主要区别在于色彩深度和细节表现能力。10bit 视频具有更高的色彩深度和更丰富的细节表现,能够提供更平滑的色彩过渡和更真实的图像质量,但需要更多的存储空间和带宽。8bit 视频则在存储和传输方面更加高效,适合于对存储空间和带…...

从零开始-将小爱接入大模型

文章目录 前言一、学习教程二、docker安装二、项目下载和配置三、文件修改文件.env.exampledeepseek模型 注册gitee并获取密钥 文件.migpt.example.js连接小爱同学 三、运行项目创建目录启动docker容器 总结 前言 基于当前人工智能的发展&#xff0c;大模型使用越来越方便&…...

关于 IoT DC3 中设备(Device)的理解

在物联网系统中&#xff0c;设备&#xff08;Device&#xff09;是一个非常宽泛的概念&#xff0c;它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...