Lua学习笔记:浅谈对闭包的认识

news2024/11/25 0:51:03
前言
本篇在讲什么

我们从几个方面简单认识和理解lua的闭包
本篇适合什么

适合初学Lua的小白
本篇需要什么

Lua语法有简单认知
依赖Lua5.1的环境
依赖Sublime Text3编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ 什么是闭包
  • ♠ lua的闭包
    • ♥ 词法定界
    • ♥ 第一类值
    • ♥ 上值(upvalue)
    • ♥ 总结
  • ♠ 推送
  • ♠ 结语


♠ 什么是闭包

  • 闭包就是能够读取其他函数内部变量的函数

  • 可以理解为,闭包就是定义在函数内部的函数

  • 本质上,闭包是将函数内部和函数外部连接起来的桥梁

例:以下述代码为例

lua方法newCounter内包含了一个局部变量count,在作用域的限制下,只有方法体内可以访问count,闭包可是让我们从外部访问count

function newCounter()
    local count = 0
end

♠ lua的闭包

首先我们需要了解几个关于Lua语法的特性,对我们理解闭包有帮助

在Lua语言中,函数是严格遵循词法定界第一类值

并且函数作为第一类值,能够逃逸出它们变量的原始定界范围


♥ 词法定界

function B()
    local b1 = 1
    local b2 = 2
    function A()
        print(b1+b2)
    end
end

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


♥ 第一类值

a = {p = print}      --> 'a.p'指向print函数
a.p ("Hello World")  --> Hello World
print =math.sin      --> print现在指向sine函数
a.p(print(1))        --> 0.8414709848079 
math.sin = a.p       --> sin现在指向print 函数
math.sin(10,20)      --> 10 20

Lua 语言中的函数与其他常见类型的值(例如数值和字符串)具有同等权限
程序可以将某个函数保存到变量中(全局变量和局部变量均可)或表中
可以将某个函数作为参数传递给其他函数


♥ 上值(upvalue)

下面我们给出例子,介绍闭包中对于局部变量的使用

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

c1 = newCounter()

print(c1())  --> 1
print(c1())  --> 2

c2 = newCounter()

print(c2())  --> 1

在内部函数_add中,使用了其外部函数的局部变量count, count对于_add方法来说被称为上值(upvalue)
上值一经获取,即被存储在闭包内,并不会随函数执行结束而消失,所以c1多次执行,内部count持续累计
c1,c2 是不同的闭包,它们建立在相同的函数之上,但是各自拥有局部变量 count
的独立实例


♥ 总结

一个闭包就是一个函数,外加能够使该函数正确访问非局部变量所需的其他机制


♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

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

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

相关文章

docker 安装常用软件

安装docker 下载docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun修改镜像仓库 vim /etc/docker/daemon.json{"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"] }查看docker …

Adapt Learning使用教程(Adapt Framework/Adapt Authoring)(一)

因为这是一个外国的技术,在国内又很小众,再加上公司业务需要用到这个东西所以就来总结一下。刚接到任务的时候也是稀里糊涂的,官网全是英文,国内也搜不到教程,让使用这个变得难上加难,没有其他教程参考我只…

InetAddress类

1. 简介 java.net.InetAddress类是Java对Ip地址的高层表示。大多数其他网络都要用到这个类,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPacket等。一般来讲,它包括一个主机名和一个IP地址。它提供了获取和操作 IP 地址的方法,…

OceanBase 4.1解读:我们支持MySQL 8.0哪些新增功能特性?

本文主要介绍 OceanBase 在 4.1 版本发布之际,对 MySQL 8.0 新增功能特性的支持情况。文章作者刘彬,OceanBase高级技术专家。曾参与 OceanBase RS、存储模块研发,目前是 SQL 执行组负责人。 MySQL 在业内是最受欢迎的关系数据库之一&#xff…

UOS下使用HHDESK文本对比功能

UOS系统从开发至今,虽然进展很大,但受限于一些因素,所支持的功能和软件,目前仍不多。 HHDESK便是其中佼佼者之一。 此篇介绍的便是HHDESK的一项便捷功能——文本对比。这个功能针对办公人员所开发,使得原本复杂的UOS…

SpringCloud-Gateway的详细讲解以及完整的示意图和代码演示

目录 SpringCloud Gateway 看一个需求,引出网关服务 Gateway 网络拓扑图-背下来 Gateway 是什么 Gateway 核心功能 Gateway VS Zuul Gateway 和Zuul 区别 Gateway 基本原理​编辑 解读: Route(路由) Predicate(断言) Filter(过滤) How It Works 工作机制…

Linux网络——shell编程之firewalld防火墙

Linux网络——shell编程之firewalld防火墙 一、firewalld概述二、iptables与firewalld的联系与区别1.iptables与firewalld的区别2.iptables与firewalld的联系 三、firewalld区域1.firewalld的九个区域2.firewalld区域介绍3.firewalld数据处理流程4.firewalld检查数据包源地址的…

【shell编程学习】反弹shell

反弹实验 机器IPwin10虚拟机192.168.242.129攻击机centos 虚拟机192.168.242.131靶机 1,win10机器安装Ncat 来监听端口 简单来说,就是下载netcat 安装包,解压,将nc.exe 复制到C:\Windows\System32的文件夹下。即可使用nc命令来…

悦亮少儿眼科樊广祥:远视储备是妈妈都该知道的眼科知识!

近视的“低龄化”和“高度化”问题日益严重,如何预防近视或推迟近视发生,已成为大家都非常关注的话题。这其中,“远视储备”一词也为越来越多的人所知晓。 为了帮助大家更好的理解远视储备、从而帮助孩子预防近视,悦亮少儿眼科(宁…

Java 期末复习进阶版

(一) 方法重载 1.同一个类中多个方法具有相同的方法名,不同的______称为方法的重载.(参数列表) 2.在某个类中存在一个方法:void getSort(int x),以下能作为这个方法的重载的声明的是(C). A)public getSort(float x) B)int getSort(int y) C)double getSort(int x,int y) D)vo…

Docker安装Yearning3.1.4/禅道18.4【亲测可用】

一、安装Yearning 1、建议先安装go 2、在mysql下新建yearning数据库: 进入mysql:docker exec -it 91ada9def680 /bin/bash 账号密码登录:mysql -uroot -p create database if not exists yearning default character set utf8mb4 collat…

MOSN 基于延迟负载均衡算法——走得更快,期待走得更稳

文|纪卓志(GitHub ID:jizhuozhi) 京东高级开发工程师 MOSN 项目 Committer 专注于云原生网关研发的相关工作,长期投入在负载均衡和流量控制领域 前言 这篇文章主要是介绍 MOSN 在 v1.5.0 中新引入的基于延迟的负载均衡算法#2…

指针---C语言

目录 前言: 一.指针基础 1.1内存单元 1.2内存单元和指针的大小 二.指针变量 2.1指针类型 2.2野指针 三.指针运算 四.指针和数组的关系 4.1下标与解引用的等价替换 4.2指针数组 五.二级指针 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的…

如何获取HTTP请求时间与响应时间【附源码】

文章目录 一、问题描述二、抓包观察三、查找文档四、思考尝试五、精益求精六、源码解说 一、问题描述 今日遇到了一个问题,要去获取HTTP报文在请求和响应的时间,因为没有原生的API可以调用,所以需要一定的技巧~ 下面主体的框架和代码&#xf…

如何在 Linux 服务器上更改分区方案?

在 Linux 服务器上,分区方案对于数据存储和系统管理至关重要。当服务器的存储需求发生变化或者需要重新组织分区时,更改分区方案是一个常见的任务。 本文将详细介绍如何在 Linux 服务器上更改分区方案。 步骤一:备份数据 在更改分区方案之前…

Microsoft Office 2013安装

哈喽,大家好。今天一起学习的是office2013的安装,有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统:Windows 7 支持Win10安装,不建议Win11安装,不支持WinXP系统 系统类型:64位 演示版本…

Jmeter函数助手函数--计数器详解

函数 作用 ${__counter(,)} 计数器,每次加1 ${__dateTimeConvert(,,,)} 时间格式转换 ${__intSum(,,)} 整数相加 ${__P(,)} 获取属性 ${__setProperty(,,)} 设置属性 ${__Random(,,)} 随机数 ${__threadNum} 线程编号 ${__time(,)} 获取当前时间戳…

Axure教程-竖向堆叠图(中继器)

本文将教大家如何用AXURE中的中继器动态竖向堆叠图 一、效果介绍 如图: 预览地址:https://wo8zqr.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87810606 二、功能介绍 简单填写中继器内容即可生成动态竖向堆…

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试 文章目录 Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试什么是单元测试?单元测试结构化程序时代单元测试与使用单元测试的误解单元测试过程成本效率不高结论单元测试的优点测试用例白盒覆盖…

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下,对PPO做GI或GR的时候,出现的异常可以在COGI中间被列出;在这些数据进入COGI之前,系统会把这些数据记录在CO1P中;换句话说,系统有时会出现DB的更新延时,当延时发生的时候&#xf…