Lua 第五章、第六章--函数

在Lua中,函数是一种对语句和表达式进行抽象的主要机制。函数既可以完成某项特定的任务,也可以只做一些计算并返回结果。

Lua具有一项非常于总不同的特征,允许函数返回多个结果:

s, e = string.find("Hello Lua users", "Lua")
print(s, e)            -->7    9

以Lua编写的函数同样可以返回多个结果,只需在return关键字后列出所有返回值即可:

function maximum (a)
local mi = 1            --最大值的索引
local m = a[mi]         --最大值
    for i, val in ipairs(a) do
        if val > m then
            mi = i; m = val
        end
    end
return m, mi    
end

print(maximum({8, 10, 23, 12, 5})        -->23    3

关于多重返回值还要介绍一个特殊函数--unpack。它接受一个数组作为参数,并从下标1开始返回该数组的所有元素:

print(unpack{1, 2, 3})        -->1    2    3
a, b = unpack{1, 2, 3}        -->a=1, b=2, 3被丢弃

Lua中的函数还可以接受不同数量的实参:

function add(...)
local s = 0
for i, v in ipairs{...} do
    s = s + v
end
return s
end

print(add(3, 4, 10, 25, 12))            -->54

参数表中的3个点(...)表示该函数可接受不同数量的实参。实际上,还可以通过变长参数来模拟Lua中普通的参数传递机制,例如:

function foo(a, b, c)
--可以转换为:
function foo(...)
local a, b, c = ...
end

Lua提供了专门用于格式化文本(string.format)和输出文本(io.write)的函数。很自然地会想到将这两个函数合二为一:

function fwrite(fmt, ...)
return io.write(string.format(fmt, ...))
end
--调用                    参数
fwrite()                 fmt = nil,没有变长参数
fwrite("a")              fmt = "a",没有变长参数
fwrite("%d%d", 4, 5)     fmt = "%d%d",变长参数为4和5

在Lua中,函数是一种“第一类值”,这表示在Lua中函数与其他传统类型的值具有相同的权利。函数可以存储到变量中或table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值。

在Lua中有一个容易混淆的概念是,函数与所有其他值一样都是匿名的,即它们都没有名称。当讨论一个函数名是(例如print),实际上是在讨论一个持有某函数的变量。

a = {p = print}
a.p("Hello World")        -->Hello World
print = math.sin          --‘print‘现在引用了正弦函数
a.p(print(1))             -->0.841470
sin = a.p                 --‘sin‘现在引用了print函数
sin(10, 20)               -->10    20
时间: 2024-10-14 11:17:45

Lua 第五章、第六章--函数的相关文章

CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

JavaScript学习笔记(第四章——第六章)

时间戳(2015-06-09 20:58:00) 第四章:变量.作用于和内存问题          typeof:判断元素是什么类型            instanceof:检测引用类型对象是否未指定类型          注:所有引用类型皆为Object的实例          JavaScript没有块级作用域:                    例1: if(true){ var color = “blue”; } alert(color);               // bl

MYSQL必知必会读书笔记 第十五和十六章 联结表

为什么要使用联结? 如果数据存储在多个表中,怎样使用单条SELECT语句检索出数据?答案就是使用联结.简单地说,可以联结多个表返回一组输出,联结在运行时关联表中正确的行. 1.创建联结 SELECT vend_name,prod_name,prod_price from vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name; 注意:在引用列可能出现二义性时,必须使用完全限定列名.

课后随笔(第五章 &amp; 第六章)

C# 的中的封装方法 ToString() 串格式化: 可以将任何变量转化为一个字符串. 如果向ToString()传入"c" , 就会把它转化为一个当地的货币值 传入 "t3" 转化为一个有三位小数的小数值 传入 "0" (也就是一个零) , 则转化为一个整数 传入 "0%" 会转化为一个整数百分比 传入 "n" 会显示一个有千分位分隔符的数 命名规范 私有字段采用 camelcase 风格 公共字段采用

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

C++ Primer【第五版】习题参考答案——第六章(函数)

本系列文章会不断更新,但是时间不能保证.另外基本上都是自己做的答案,仅供参考,如果有疑问欢迎交流. #include <iostream> #include <initializer_list> using namespace std; int test_Ex_6_27(std::initializer_list<int> li); int main() { cout << test_Ex_6_27({23,78,89,76,90}) << en

第六章 深入理解函数 Lua程序设计笔记

--第六章 深入理解函数Lua中函数是"第一类值",与其他传统类型有相同的权利:可以储存到变量或table中,可以作为函数实参传递,还可以作为函数的返回值. 函数的标准定义: foo = function(x) return x*2 end 一个函数定义实际上就是一条赋值语句,这条语句创建了一种类型为"函数"的值,并将这个值赋予一个变量. --6.1closure(闭合函数) function newCounter() local i = 0 return func

JavaScript DOM编程艺术-学习笔记(第五章、第六章)

第五章: 1.题外话:首先大声疾呼,"js无罪",有罪的是滥用js的那些人.js的father 布兰登-艾克,当初为了应付工作,10天就赶出了这个js,事后还说人家js是c语言和self语言"约"的产物,(百度百科说的,这些).....一个可怜的孩子-js.然后命运弄"人",js此时已世人皆知.可能是因为js的毁誉参半,它老爸才不想承认它吧.如果js会说话,它可能会给它布兰登-艾克说,"你当初怎么不把*******在墙上".这

(转载)虚幻引擎3--第六章 –函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分: SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Client R

第六章函数和宏定义

C程序设计实验报告 实验项目: 第六章函数和宏定义 姓名:李儿龙  实验地点:514教室 实验时间:5.16 一.实验目的与要求 1.模块化程序设计: 6.4.2.2. 利用复化梯形公式计算定积分 掌握C语言中定义函数的方法: 掌握通过“值传递”调用函数的方法. 6.4.2.3. 计算Ackerman函数 掌握递归函数的设计方法: 进一步练习阅读检查与调试修改C程序的方法. 6.4.3.1. 编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 写出该