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

ops/2025/2/7 1:26:26/

💓博主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/ops/156306.html

相关文章

深入探索 Android 技术:从基础到前沿

深入探索 Android 技术:从基础到前沿 在移动应用开发领域,Android 凭借其开源特性和庞大的用户基础,成为开发者们不可忽视的重要平台。今天,让我们深入探讨 Android 技术的方方面面,从基础原理到前沿应用,…

高压GaN(氮化镓)器件在工业和汽车应用存在的致命弱点

高压GaN(氮化镓)器件在工业和汽车应用存在的致命弱点和被成熟低价的碳化硅MOSFET取代的原因。 高压GaN(氮化镓)器件虽然因其高电子迁移率、高击穿场强和高频特性备受青睐,但在大功率高压应用(如电动汽车、光…

基于PostGIS的省域空间相邻检索实践

目录 前言 一、相关空间检索函数 1、ST_touches函数 2、ST_Intersects函数 3、ST_Relate函数 4、区别于对比 二、空间相邻检索实践 1、省域表相关介绍 2、相关省域相邻查询 3、全国各省份邻居排名 三、总结 前言 在当今数字化时代,地理空间数据的高效管理…

对比JSON和Hessian2的序列化格式

在分布式系统中,数据的序列化和反序列化是关键环节。不同的序列化格式在性能、可读性和跨语言兼容性上存在显著差异。本文将详细对比JSON和Hessian2这两种序列化格式,以帮助开发者在不同的应用场景中做出更好的选择。 JSON 概述 JSON(Java…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC;如果没有找到hex文件(在objects文件夹下),在keil中options for target-output- 勾选 create hex file。 如果要修改编程 :重新编译-下载/编程-单片机重…

AJAX综合案例——图书管理

黑马程序员视频地址: AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖的第25集视频&#xff0c…

SQL server 创建DB Link 详解

在日常工作中,经常涉及到跨库操作,为使跨数据库的操作变得更加灵活高效,我们可以在 SQL Server 中建立数据库链接( DB Link),实现 SQL Server 数据库与其他数据库(如 Oracle, MySQL 等&#xff…

【Conda 和 虚拟环境详细指南】

Conda 和 虚拟环境的详细指南 什么是 Conda? Conda 是一个开源的包管理和环境管理系统,支持多种编程语言(如Python、R等),最初由Continuum Analytics开发。 主要功能: 包管理:安装、更新、删…