【lua编程实操(一)】函数和闭包

embedded/2025/2/7 11:54:32/

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:lua从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多lua语言的知识
  🔝🔝


lua编程实操

  • 1. 函数的类值
  • 2. 词法定界
  • 3. 总结

1. 函数的类值

lua语言中, 函数和其他常见类型(如整形, 字符串)具有相同的权限, 是第一类值: 一个程序可以将函数保存至某个变量或表中, 也可以将函数作为参数传递给其他函数, 甚至可以当作返回值

以下示例演示了第一类值得含义:

lua">a = {p = print) --'a.p'指向print函数
a.p("hello world")  --> hello world
print = math.sin  -- print现在指向sin
a.p(print(1)  --> 0.841471
math.sin = a.p  -- sin现在指向a.p
math.sin(10,20)  --> 10 20

函数在lua语言中其实就是一个值
创建函数有两个常见得方式:

lua">function foo(x) return x*2 end-- 赋值语句右边得表达式被称为函数构造器, 与表构造器{}类似
foo = function (x) return x*2 end

需要注意得是, lua语言中得函数都是匿名的, 像其他的所有值一样, 函数没有名字, 当讨论print或math.sin时, 实际上指的是保存该函数得变量。下面介绍一下table.sort函数的用法, sort可排序某个表, 第二个参数可指定排序的内容, 类似于CPP中的lambda表达式

lua">network = {{name="neo", ip="127.0.0.1"},{name="jack", ip="127.0.0.2"},{name="roy", ip="127.0.0.3"},{name="anna", ip="127.0.0.4"}
}
-- 针对name字段排序
table.sort(network,function (a,b) return (a.name > b.name) end)
-- 针对ip字段排序
table.sort(network,function (a,b) return (a.ip > b.ip) end)

2. 词法定界

当编写一个被其他函数B包含的函数A时, 被包含的函数A可以访问包含其的函数B的所有局部变量, 这种特性被称为词法定界

示例: 函数用于排序一个表

lua">names = {'peter", "paul", "mary"}
grades = {mary=10,paul=7,peter=8}function sortbygrade (names,grades)table.sort(names,function (n1,n2) return grades[n1] > grades[n2] end)
end

传给函数sort的匿名函数可以访问grades, 而grades是包含匿名函数的外层函数sortbygrade的形参. 在该匿名函数中, grades既不是全局变量也不是局部变量, 而是被称为非局部变量, 函数作为第一类值, 可以逃避出它们变量的原始定界范围, 考虑如下的代码:

lua">function newcounter ()local count = 0return function () --匿名函数count = count + 1return countend
end
c1 = newcounter()
print(c1()) --> 1
print(c1()) --> 2
c2 = newcounter()
print(c2()) --> 1
print(c2()) --> 2
print(c1()) --> 3

上诉代码中, 匿名函数访问了非局部变量count, 并将其当作计数器, 然而由于newcounter函数已经返回, 因此我们在调用匿名函数时, 变量count似乎已经超出了作用范围, 但其实不然, 由于闭包概念的存在, lua语言能正确的应对这种情况. 简单来说, 一个闭包就是一个函数外加能够使该函数正确访问非局部变量所需的其他机制. 上诉c1和c2是两个不同的闭包, 它们建立在相同的函数上, 但是拥有各自的局部变量count的独立实例


3. 总结

其实从技术角度上讲, lua语言只有闭包而没有函数, 函数本身只是闭包的一种原型, 闭包在很多场合都很有价值, 具有很大的探索意义


http://www.ppmy.cn/embedded/160291.html

相关文章

Axure设计元件库分享——SpringUI Web端动态交互元件库

在快节奏的Web设计与开发领域,设计师们总是在寻找那些能够助力他们快速构建出功能丰富且界面美观原型的工具。SpringUI,一个专为Web设计与开发领域打造的高质量、全面且易于使用的交互元件集合,正是这样一个能够满足设计师需求的优秀元件库。…

SQL Server的安装和简单使用

目录 一、SQL Server 1.1、简介 1.2、安装包 二、安装SQL Server 2.1、双击安装包 2.2、选择自己想要安装的位置 2.3、点击安装 2.4、安装完成之后会出现以下页面,按照序号依次点击 2.5、不用管密钥,点击下一步 2.6、选择【我接受】 2.7、是否…

【腾讯云】腾讯云docker搭建单机hadoop

这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题3)-网络部分解析-附详细代码

目录 附录1:拓扑图 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.AP2 14.AP3 15.EG1 16.EG2 附录1:拓扑图 附录2:地址规划表 设备

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库(如 sklearn、pan…

langchain教程-3.OutputParser/输出解析

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…

旋转变压器工作及解调原理

旋转变压器 旋转变压器是一种精密的位置、速度检测装置,广泛应用在伺服控制、机器人、机械工具、汽车、电力等领域。但是,旋转变压器在使用时并不能直接提供角度或位置信息,需要特殊的激励信号和解调、计算措施,才能将旋转变压器…

C++语法·十伞

目录 仿函数 1.定义 2.作用 3.实现 deque(双端队列) 优点: 缺点: stack(栈) 1.使用 2.模拟实现 queue(队列) 1.使用 2.模拟实现 priority_queue(优先级队列…