《lua程序设计 第二版》 学习笔记6 -------- 深入函数

-- 第6章 深入函数

-- 函数是一种“第一类值”,他们具有特定的“词法域”
-- “第一类值”:与其他传统类型的值具有相同的权利。例如:存储到变量/table中,作为实参传递给函数或者作为其他函数的返回值
-- "词法域":一个函数可以嵌套在另一个函数中,内部函数可以反问外部函数的变量。
local function testFun(x) return 2 * x end -- 函数定义方式1
local testFun = function (x) return 2 * x end -- 函数定义方式2 一个变量
print(testFun(1));
testFun = nil;
-- 当我们讨论 print是在说一个持有某函数的变量,和一般变量是一样的
print(type(print));
local p1 = print;
local p2 = print;
p1("abc");
p1 = nil -- 指向print持有打印功能的函数 被删除
-- print = nil; -- 指向某答应功能的函数 只剩下 p2 全局变量, print不复存在
-- 这里更变量时一样的
p2("abc");
-- p2 = nil -- 这个时候指向控制到打印功能的函数的变量都没有了【不知道此函数会不会被回收,据说变量会】
-- 尽量保持使用local

local info = {
{name = "salor", id = 2},
{name = "salor3", id = 1},
{name = "salor2", id = 3},
}

local printArray = function (table_name)
for k,v in pairs(table_name) do
print(k,v.name, v.id)
end
end

printArray(info);

local function sortByName(table_name)
table.sort(table_name,
function (a, b)
return (a.name > b.name)
end)
end

local function sortById(table_name)
table.sort(table_name,
function (a, b)
return (a.id > a.id)
end
)
end

sortByName(info);
printArray(info);
sortById(info);
printArray(info);

-- closure (闭合函数)
-- 函数内的另一个函数,这个函数可以访问外部函数的局部变量【词法域】
-- 见 sortByName 和 sortById 这两个函数, sort 的匿名函数可以访问外部函数的参数
-- 外部函数的参数不是一个全局变量、也不是局部变量

-- 利用上面的特性,可以做一个简单的定时器
local function newCounter()
local i = 0;
return function ()
i = i + 1;-- 访问外部函数的临时变量
return i;
end
end

local c = newCounter()
c()
c()
print(newCounter());
print(c()); -- 3
local c2 = newCounter();
print(c2()); -- 1
--c1 和 c2 有不同i 和 closure ,从技术上讲,lua只有closure而不存在"函数"
-- 函数本身就是特殊的closure

--- closure 除了作为高级函数的参数,计数函数之外,它对回调函数也很有用,还可以重新定义某些存储在普通变量中的函数
do
local oldSin = math.sin
local k = math.pi / 180
math.sin = function(x)
return oldSin(x * k)
end
yend

-- 6.2 非全集的函数
-- 保存在table中函数
Lib = {}
Lib.foo = function (x, y) return x * y end;
function Lib.goo (x, y) return x + y end;

-- 6.3 正确的尾调用
function rAdd(x)
if x <= 0 then
return 1;
else
return x + rAdd(x -1);-- 这不是一种尾调用
end

-- function f(x) return g(x) end
-- g 调玩后返回到f,不需要保存g的任何信息,所以不需要任何栈的使用...
-- 正确的尾调用在状态机中是很重要的...

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

《lua程序设计 第二版》 学习笔记6 -------- 深入函数

时间: 2024-12-07 08:53:30

《lua程序设计 第二版》 学习笔记6 -------- 深入函数的相关文章

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo

锋利的jquery第二版学习笔记

jquery系统学习笔记 一.初识:jquery的优势:1.轻量级(压缩后不到30KB)2.强大的选择器(支持css1.css2选择器的全部 css3的大部分 以及一些独创的 加入插件的话还可支持XPath)3.出色的Dom封装(简化原本复杂的操作)4.可靠的事件处理机制(跨浏览器兼容性)5.完善的Ajax操作(一个$.ajax()方法全部搞定)6.不污染顶级变量(只使用了一个名为jQuery的对象 其别名$也可随时让出其控制权 见解决和其它库混用时解决冲突部分)7.出色的浏览器兼容性(优秀的j

第一章 开始 Lua程序设计第二版笔记

--第一章 开始--1.1chunk 程序块chunk大小可以任意,一个源代码文件或交互模式中的一行代码都是chunk --1.2词法规范标识符通常保留下划线开头,作为Dummy Variable使用. --1.3全局变量Lua中访问一个未初始化的变量不会引发错误,访问结果是一个nil print(b) -->nil

MongoDB权威指南第二版学习笔记二

数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和false {“x”:true} 数值 shell默认使用64位浮点型数值. {“x”:3.14} 或 {“x”:3} 对于整型值,可使用NumberInt类(表示4字节带符号整数)或NumberLong类(表示8字符带符号整数) {“x”:NumberInt(”3”)} {“x”:NumberLong(

MongoDB权威指南第二版学习笔记——MongoDB简介

MongoDB简介 MongoDB在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流web应用的关键功能:索引.复制.分片.丰富的查询语法,特别灵活的数据模型.与此同时还不牺牲速度. MongoDB是一款强大.灵活,且易于扩展的通用型数据库.能扩展出非常多的功能,如二级索引.范围查询.排序.聚合,以及地理空间索引. 设计特点 易于使用 MongoDB是一个面向文档的数据库,比关系型数据库有更好的扩展性.用文档代替行.能够仅使用一条记录来表现发展的层次关系.

irectX 9.0c游戏开发手记之“龙书”第二版学习笔记之10: Chap12: Blending

这一章讲的是Blending,包括alpha 混合和alpha 测试两个方面.这一章的内容总体来说比较简单.然而,后面的习题却并不是很简单-- 下面是习题解答部分: 习题1部分: =============================================================================== 这道题让我们研究使用不同的blend factor和blendop所产生的效果.这个实现起来不难,我就不打算详细解释了,大家都能够看懂的.另外,为了简单,我就不

MongoDB权威指南第二版学习笔记(四)—增删改文档下

$slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为10,如果$push 后的数组的元素个数小于10,那么所有元素都会保留.反之,只有最后那10个元素会保留.因此,$slice 可以用来在文档中创建一个队列. db.class.insert({"班级":"1班"}) WriteResult({ "nInsert

学习bash第二版 学习笔记 1 —— bash的简介、检测和安装

shell 区别于内核 是一款命令解析程序. Bourne Again shell (BASH), 创建用于GNU项目. GNU项目由Free Software Foundation(FSF)的Richard Stallman 始创,用于创建一个UNIX兼容的操作系统, 并使用该免费的发布版本替代所有的商业UNIX版本. ?? 你可能不能马上用bash.你的系统管理员可能将你的账号设置为使用系统上的 "标准" shell,你甚至不知道有没有其他shell可用. ?? 键入 echo $

python cookbook第三版学习笔记九:函数

接受任意数量参数的函数. 当传入函数的参数个数很多的时候,在函数定义的时候不需要为每一个参数定义一个变量,可以用*rest的方式来包含多余的参数. 如下面的代码,*rest包含了2,3,4这3个参数.且可以迭代访问.在这个例子中,rest其实就是其他位置参数组成的一个元组 def avg(first,*rest):     for i in rest:         print i     average=(first+sum(rest))/(1+len(rest))     print av