lua学习之深入函数第一篇
深入函数第一篇
- 函数是第一类值,具有特定的词法域
第一类值
- 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力
- 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中
- 可作为实参传递给其他函数,也可以作为其他函数的返回值
词法域
定义:一个函数可以嵌套在另一个函数中,内部函数可以访问外部函数定义的局部变量
函数与其他所有的值一样都是匿名的,没有名称
讨论
print()
函数时,相当于在讨论值仅为print()
的变量
a = {p = print}
a.p("Hello World") -- Hello World
c = print
c("eee") -- eee
print = math.sin
a.p(print(math.pi / 2)) -- 1
sin = a.p
sin(10, 20) -- 10 20
function foo(x)
return 2 * x
end
-- 等价于
foo = function (x) return 2 * x end
匿名函数
- 一个函数定义可以是一条赋值语句,这样的函数表达式可以视为函数构造式,这种函数构造式的结果称为匿名函数
- 一般会将函数赋予全局变量
function foo(x)
return 2 * x
end
-- 等价于
foo = function(x) return 2 * x end
高阶函数
- 像
table.sort()
这样的函数接收另一个函数作为实参的函数就称它为高阶函数
-- table.sort 对 table 中的所有元素进行排序
network = {
{name = "atest", IP = "255.255.255.0",}
{name = "btest2"}, IP = "255.255.255.1"},
{name = "ctest3"}, IP = "255.255.255.3"},
{name = "dtest4"}, IP = "255.255.255.4"},
}
table.sort(network,
function (a, b)
return (a.name > b. name)
end
)
-- 导数 (f(x + d) - f(x)) / d 函数在某一个点处的导数
function derivative (f, delta)
delta = delta or 1e-4
return function (x)
return (f(x + delta) - f(x)) / delta
end
end
-- sin 的导数是 cos
c = derivative(math.sin)
print(math.sin(1), c(1))
print(math.sin(1), math.cos(0))
闭合函数
names = {"Pe", "Tu", "Me"}
grades = {Pe = 10, Tu = 5, Me = 8}
table.sort(names, function (x, y)
return grades[x] > grades[y]
end
)
-- 按照年级进行排序
print(names[1], names[2], names[3])
function sortByGrade(names, grades)
table.sort(names, function (x, y)
return grades[x] > grades[y]
end
)
end
sortByGrade(names, grades)
- 匿名函数中调用外部函数的形参的变量称为非局部变量。
- 一个
closure
就是一个一个函数加上该函数所需访问的所有「非局部变量」 - 如果再次调用
newCounter
,那么他会创建一个新的局部变量i
从而也会得到一个新的closure
function newCounter()
local i = 0
return function ()
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) -- 1
print(c1()) -- 2
-- 重新定义 sin 函数,弧度转为角度
oldSin = math.sin
math.sin = function (x)
return oldSin(x * math.pi / 180)
end
do
local oldSin = math.sin
local k = math.pi / 180
math.sin = function (x)
return oldSin(x * k)
end
end
-- 限制一个程序访问文件
do
local oldOpen = io.open
local access_OK = function (filename, mode)
-- <检查访问权限的代码>
end
io.open = function (filename, mode)
if access_OK(filename, mode) then
print("允许访问")
return oldOpen(filename, mode)
else
print("不允许访问")
return nil, "access denied"
end
end
end
lua学习之深入函数第一篇的更多相关文章
- lua学习之深入函数第二篇
深入函数 2 非全局的函数 函数是第一类值,函数可以存储到全局变量,局部变量,table 字段中 lua 函数库中的大部分函数存储到 table 字段中 Lib = {} Lib.foo = func ...
- lua学习之类型与值篇
类型与值 lua 是动态类型的语言 在语言中没有类型定义的语法 每个值都携带有它的类型信息 8种基础类型 用 type 可以返回这个值的类型的名称 将一个变量用于不同类型,通常会导致混乱的代码 但合理 ...
- 深入学习jQuery选择器系列第一篇——基础选择器和层级选择器
× 目录 [1]id选择器 [2]元素选择器 [3]类选择器[4]通配选择器[5]群组选择器[6]后代选择器[7]兄弟选择器 前面的话 选择器是jQuery的根基,在jQuery中,对事件处理.遍历D ...
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
- 任务驱动,Winform VS WEB对比式学习.NET开发系列第一篇------身份证解析(不断更新的WEB版本及Winform版本源码)
一 本系列培训随笔适用人群 1. 软件开发初学者 2. 有志于转向Web开发的Winform程序员 3. 想了解桌面应用开发的Web程序员 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分 ...
- Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组
1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...
- 华为LiteOS系统使用-任务调度函数-第一篇
1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...
- 浅聊本人学习React的历程——第一篇生命周期篇
作为一个前端小白,在踏入前端程序猿行业的第三年接触了React,一直对于框架有种恐惧感,可能是对陌生事物的恐惧心里吧,导致自己一直在使用原生JS和JQ作为开发首选,但是在接触了React之后,发现了其 ...
- python之函数第一篇
一.为什么用函数: 解决代码重用问题 统一维护 程序的组织结构清晰,可读性强二.定义函数 先定义后使用!! def funcname(arg1,arg2,...): """ ...
随机推荐
- MyBatis5——Mybatis整合log4j、延迟加载
开启日志:Log4j (1)加入jar包 (2)在conf.xml中配置开启日志: <settings> <!-- 开启日志,并指定要使用的具体日志为log4j -- ...
- Docker基础内容之数据持久化
数据卷的特性 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS 数据卷可以在容器之间共享和重用,相当于将一个分区挂载到多个目录下面 数据卷内容的修改会立马生效 数据卷的更新,不会影响镜像: ...
- Leetcode 题目整理-4 Longest Common Prefix & Remove Nth Node From End of List
14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...
- 12、PPP和HDLC
PPP主要包括三个部分1. 在串行链路上封装上层数据报文的方法2. LCP(link control protocals): 链路控制协议来配置和测试数据通信链路,协商PPP协议的配置参数 ...
- 死磕mysql(2)
想测试自己的查询语句,导入批量的数据,一开始很慢以为是自己的语句有问题,后来是这个autocommit,效率相差好多好多............ delimiter // create procedu ...
- 解决Eclipse无法安装STS
使用Eclipse Neon安装Spring Tool Suite报错: Cannot complete the install because one or more required items ...
- FFMPEG学习----使用SDL播放PCM数据
参考雷神的代码: /** * 最简单的SDL2播放音频的例子(SDL2播放PCM) * Simplest Audio Play SDL2 (SDL2 play PCM) * * 本程序使用SDL2播放 ...
- HDU_5058_set
http://acm.hdu.edu.cn/showproblem.php?pid=5058 set容器的使用,set中保持元素的唯一性和有序性. 也可以用排序加离散化来模拟. #include< ...
- HDU_5094_dfs
http://acm.hdu.edu.cn/showproblem.php?pid=5094 bfs,vis[x][y][z],z表示钥匙的状态,用二进制来表示,key[x][y]储存当前位置钥匙的二 ...
- Virus:病毒查杀
简介 小伙伴们,大家好,今天分享一次Linux系统杀毒的经历,还有个人的一些总结,希望对大家有用. 这次遇到的是一个挖矿的病毒,在挖一种叫门罗币(XMR)的数字货币,行情走势请看 https://ww ...