《Lua程序设计》--学习4

news2024/11/6 19:51:49

闭包

在Lua语言中,函数是严格遵循词法定界(lexicalscoping)的第一类值(first-classvalue)。

“第一类值”意味着Lua语言中的函数与其他常见类型的值(例如数值和字符串)具有同等权限:一个程序可以将某个函数保存到变量中(全局变量和局部变量均可)或表中,也可以将某个函数作为参数传递给其他函数,还可以将某个函数作为其他函数的返回值返回。

“词法定界”意味着Lua语言中的函数可以访问包含其自身的外部函数中的变量(也意味着Lua语言完全支持Lambda演算)。

函数是第一类值

 

 赋值语句右边的表达式(function(x)body end)就是函数构造器,与表构造器{}相似。因此,函数定义实际上就是创建类型为"function"的值并把它赋值给一个变量的语句。

在Lua语言中,所有的函数都是匿名的(anonymous)

像其他所有的值一样,函数并没有名字。当讨论函数名时,比如print,实际上指的是保存该函数的变量。虽然我们通常会把函数赋值给全局变量,从而看似给函数起了一个名字,但在很多场景下仍然会保留函数的匿名性

匿名函数在这条语句中显示出了很好的便利性

像函数sort这样以另一个函数为参数的函数,我们称之为高阶函数(higher-order function)。高阶函数是一种强大的编程机制,而利用匿名函数作为参数正是其灵活性的主要来源

非全局函数

函数不仅可以被存储在全局变量中,还可以被存储在表字段局部变量中。

将函数存储在表字段中,大部分Lua语言的库就采用了这种机制,下列的示例创建了这种函数

 在表字段中存储函数是Lua语言中实现面向对象编程的关键要素。

当把一个函数存储到局部变量时,就得到了一个局部函数(local function),即一个被限定在指定作用域中使用的函数。局部函数对于(package)而言尤其有用:由于Lua语言将每个程序段(chunk)作为一个函数处理,所以在一段程序中声明的函数就是局部函数,这些局部函数只在该程序段中可见。词法定界保证了程序段中的其他函数可以使用这些局部函数。

在定义局部递归函数(recursive local function)时,由于原来的方法不适用,所以有一点是极易出错的

 当Lua语言编译函数体中的fact(n-1)调用时,局部的fact尚未定义。因此,这个表达式会尝试调用全局的fact而非局部的fact。我们可以通过先定义局部变量再定义函数的方式来解决这个问题:

所以使用这种定义方式更合适

在间接递归的情况下,必须使用与明确的前向声明(explicit forward declaration)等价的形式:

请注意,不能在最后一个函数定义前加上local。否则,Lua语言会创建一个全新的局部变量f,从而使得先前声明的f(函数g中使用的那个)变为未定义状态。

词法定界

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

---[[
function newCounter(  )
	local count = 0
    return function (  )
	  count = count + 1
      return count
    end
end

c1 = newCounter()
print(c1())
print(c1())
print(c1())
c2 = newCounter()
print(c2())
--]]

 

好怪啊,重复调用的时候那个count还在里面,c1的count是c1的,c2的是c2的,互不干涉

 c1和c2是不同的闭包。它们建立在相同的函数之上,但是各自拥有局部变量count的独立实例。

从技术上讲,Lua语言中只有闭包而没有函数。函数本身只是闭包的一种原型

由于函数可以被保存在普通变量中,因此在Lua语言中可以轻松地重新定义函数,甚至是预定义函数。

当重新定义一个函数的时候,我们需要在新的实现中调用原来的那个函数

 上述代码使用了do代码段来限制局部变量oldSin的作用范围;根据可见性规则,局部变量oldSin只在这部分代码段中有效。因此,只有新版本的函数sin才能访问原来的sin函数,其他部分的代码则访问不了。

我们可以使用同样的技巧来创建安全的运行时环境(secure environment),即所谓的沙盒(sandbox)。

我们可以通过使用闭包重定义函数io.open来限制一个程序能够访问的文件:

 

模式匹配

模式匹配的相关函数

函数string.find

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Proteus仿真之LCD1602

1.项目简介:利用Proteus仿真在LCD1602上显示字母。 2.设计思路:首先要读懂LCD1602的时序图和每一个端口高低电平时的含义。 然后,通过操作的端口的高低电平来达到操作数据的目的。主要思路是,根据端口的组合来,将数据…

信号原理解析

目录 一、什么是信号 举例子: 进程如何认识信号 信号与进程的异步 进程如何储存信号 二、一个实例 signal函数: 三、实例后的思考 一个进程接受到信号后,处理信号的方法: myhandler什么时候才会被调用 四、理解ctrlc被…

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

第五十回:TabBarView Widget

文章目录 概念介绍使用方法示例代码综合使用 我们在上一章回中介绍了DefaultTabBarController Widget相关的内容,本章回中将介绍 TabBarView Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们这里介绍的TabBarView类似前面章回中介绍过的PageView组件&a…

应对数据不平衡和过拟合的分类模型优化策略

不平衡分类 数据类别不平衡问题是指数据集中各类别样本数量不对等的情况。 基于抽样的方法 在处理这类问题时,可以采用基于抽样的方法来解决。以下是几种常见的基于抽样的方法: 两阶段学习 两阶段学习是一种解决不平衡分类问题的方法,包括…

软件测试 之Web项目实战解析(附全套实战项目教程+视频+源码)

软件测试之web项目实战 按顺序依次为:【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】 一:搭建测试环境 (1) 搭建测试环境之 【常见项目结构模式】 (2&am…

【大数据之路3】分布式协调系统 Zookeeper

3. 分布式协调系统 Zookeeper 1. Zookeeper 概述1. Zookeeper 介绍2. Zookeeper 结构/功能【重点】1. 文件系统 ZNode1. ZNode 特点2. ZNode 功能3. ZNode 介绍【非常重要】 2. 监听机制 3. 典型应用场景1. 命名服务2. 配置管理3. 集群管理4. 分布式锁5. 队列管理 2. 架构与原理…

MaskRCNN与注意力机制

Mask RCNN---two stage mask rcnn是一个分割算法(实例分割),可用于: 目标检测 实例分割 关键点检测 本质上,mask R-CNN是在faster rcnn的基础上,加入了FCN模块,得到最终的分割结果。 先检测,再分割。不…

实战:在Docker上部署Springboot项目(附源码)

实战:在Docker上部署Springboot项目(附源码) 1、docker的基本使用 1、为什么使用docker 2、docker的介绍 3、docker安装 https://www.codezhou.top/article/docker%E4%BD%BF%E7%94%A8 2、dockers安装mysql 拉取 Mysql 5.7.31 镜像 dock…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业,一个一直被讨论的问题就是:手工测试没有前途,自动化测试会取代手工测试? 首先说结论:自动化测试不会取代手工测试,这完全是两个维度的事情。为什么不会呢?我们需要从本源上说起。 什…

【数据挖掘实战】——舆情分析:对微博文本进行情绪分类

🤵‍♂️ 个人主页:Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 &#x1f4a…

Tomcat部署及多实例部署

Tomcat部署及多实例部署 一、什么是Tomcat二、Tomcat核心组件1.什么是servlet2.什么是 JSP 三、Tomcat 功能组件结构1.Connector2.Container2.1Container 包含四个子容器 3.Service 四、Tomcat 请求过程五、Tomcat 服务部署1.关闭防火墙2.上传jdk包,查看jdk版本&…

SpringCloud Gateway网关多路由配置访问404解决方案

文章目录 一、问题描述:SpringCloud GateWay Eureka访问出现404,Not Found二、解决方案:1、 配置 filters: - StripPrefix12、删除冲突依赖3、检查启动类4、检查配置文件 一、问题描述:SpringCloud GateWay Eureka访问出现404&#xff0c…

如何用新范式解决安全难题?数字安全免疫力研讨论坛给你答案!

6月13日,腾讯安全、腾讯研究院将联动IDC、《中国信息安全》杂志社、CIO 时代、新基建创新研究院等多家行业机构、媒体共同发起「数字安全免疫力」研讨论坛,汇聚产学研各界专家,研判安全态势、分享最佳实践,碰撞新一代的安全理念&a…

【Java基础学习打卡02】计算机硬件与软件

目录 引言一、硬件组成二、软件组成三、软硬件工作流程四、性能指标五、选购建议总结 引言 本小节将认识计算机硬件与软件,以及软硬件工作流程,还要知道计算机性能指标,并可以指导我们购买电脑。还是那句话,了解计算机工作流程对…

Qt6之样式表

Qt的样式表主要是受到CSS的启发,通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(),你可以为一个独立的子部件、整个窗口,甚至是整个应用程序指定一个样式表。样式表由影响窗口部件绘制的样式规则组成。这些规则都是普通文本…

stable-diffusion领域prompt集合

有什么写实的stable diffusion模型? - 知乎试了试这个模型,感觉勉强,大佬们知道有没有更写实的模型?https://huggingface.co/CompVis/stable-diff…https://www.zhihu.com/question/567026134Stable Diffusion好看的御姐风AI美女P…

数据仓库分析工具Hive

数据仓库分析工具Hive 概述Hive简介Hive与Hadoop生态系统中其他组件的关系Hive与传统数据库的对比 Hive系统架构概述Hive组成模块Hive工作原理SQL语句转换成MapReduce的基本原理Hive中SQL查询转换成MapReduce作业的过程 从外部访问Hive的典型方式 Hive的应用Hive在报表中心的应…

jmeter性能测试实战--web程序

目录 前言: 项目背景 测试步骤 前言: JMeter是开源的Java性能测试工具,广泛应用于Web、移动应用程序等领域的性能测试中。在Web应用程序中,JMeter能够模拟多用户并发请求,验证系统在高负载情况下的性能&#xff0c…

【王道考研】王道数据结构与算法详细笔记(全)

目录 第一章 数据结构绪论 1.1 数据结构的基本概念 1.2 数据结构的三要素 1.2.1. 数据的逻辑结构 1.2.2. 数据的存储结构(物理结构) 1.2.3. 数据的运算 1.2.4. 数据类型和抽线数据类型 1.3 算法的基本概念 1.4 算法的时间复杂度 1.5 算法的空…