函数的定义:在Lua中,函数是一种对语句和表达式进行抽象的主要机制。

一、函数基本用法
 
     在Lua中,
     1、函数既可以完成某项特定的任务。(被视为一条语句)
     2、也可以只做一些计算并返回结果。(被视为一句表达式)
格式:
     function function_name( ... )    

-- body
     end

     ---- 等同于 
     function_name=function( ... )  --body  end

声明:
     function关键字声明函数。end 关键字定义函数体的结束位置。( ... )参数列表用于值传递。
调用:
     以上无论哪种用法都需要将所有参数放到一对圆括号中,即使调用函数没有参数列表,也必须写出一对空括号。
对于此规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字面字符或table构造式,那么圆括号便是可有可无的。
 
 
二、多重赋值与多重返回值
 
     定义:若实参多余形参,则舍弃多余的实参;若实参不足,则多余的形参初始化为nil。
形式参数:由调用函数时的“实际参数”初始化的,用法与局部变量相似。如
 
 
     在Lua中,会自动调整函数返回值的数量以适应不同的调用情况。
     1、若函数调用作为一条单独的语句时,Lua会丢弃所有返回值。
     2、若函数作为表达式中的一部分来调用时,Lua只会保留函数的第一个返回值。
     3、只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素)时。才能获得函数的所有返回值。
 
 
     特殊函数unpack:接受一个数组作为参数,并从下标1开始返回该数组的所有元素。unpack的一项重要用途体现在“泛型调用”机制中,泛型机制可以动态的以任何实参来调用任何函数。
 
 
三、变长参数
     在Lua中函数还可以接受不同数量的实参。例如print函数,在调用时可以传入一个或多个实参。
 
     
 
函数的变长参数以 “...”三个点表示,函数如果要访问变长参数时,使用“{...}”表达式来访问,这样变长参数会以table表中的元素的形式存在,这就像访问一个table一样,访问所有变长参数。然而在某些特殊的情况下,变长参数中会有nil值,此时就需要使用select来访问变长参数。
     调用select时必须传入一个固定的实参select(选择开关)和一系列变长参数。
格式     
     1、select( index,... ) 返回从index下标开始一直到变长参数列表结尾的元素。
     2、select( '#',... ) 返回变长参数列表的长度
 
 
四、闭合函数
     
     定义:若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为“词法域”。
外部函数中的局部变量在匿名函数内既不是全局变量,也不是局部变量,将其称之为“非全局变量”。
     计数器的实现:
 
 
五、非全局的函数
 
     只要将一个函数存储到一个局部变量中,就能得到一个“局部函数,也就是说只能在其作用域中使用。也可以在table中使用函数定义,即函数作为table中的元素存在。如:
 
 
     当让Lua还有一种声明局部函数的方法:
 
 
六、正确的尾调用
     
     尾调用的定义:当一个函数调用是另一个函数的最后一个动作时,该调用是一条“尾调用”。
     function f( x ) return g( x ) end
     尾调用的意义:当f函数调用完g函数后就再没有可执行的工作时,程序就不需要返回那个g所在的函数了。所以在尾调用之后程序也不需要保存任何关于该函数的栈信息了。当g返回时,执行控制权可以直接返回到调用f的那个点上。这种实现称为支持“尾调用消除”。
     因此由于“尾调用”不会耗费栈空间,所以一个程序可以拥有无数嵌套的“尾调用”而不用担心造成栈溢出。必须明确确认尾调用:
 

Lua 学习笔记(五)函数的更多相关文章

  1. Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

    1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...

  2. Python学习笔记(五)函数和代码复用

    函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...

  3. Go语言学习笔记(五) [函数]

    日期:2014年7月29日   1.函数定义:func (p type) funcname(q int) (r,s int) {return 0,0 }     func: 保留字,用于定义一个函数 ...

  4. python学习笔记(五)---函数与类

    函数 def为定义函数的一个标志 demo1: def greet_user(username): print("Hello, " + username.title() + &qu ...

  5. JS学习笔记 (五) 函数进阶

    1.函数基础 1.1 函数的基本概念 函数是一段JavaScript代码,只被定义一次,但是可以被调用或者执行许多次.函数是一种对象,可以设置属性,或调用方法. 函数中的参数分为实参和形参.其中,形参 ...

  6. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  7. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  8. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  9. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  10. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

随机推荐

  1. 黑马程序员----java基础笔记下(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 目录--- 21.字符编码 22.javaswig 事件 23.socket 网络通讯 24.网 ...

  2. css3 linear-gradient实现页面加载进度条效果

    最终效果图: html结构: <div>    <p class="p1">        <span></span>    < ...

  3. RunTimeException包括:

    大约有如下几种: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常 IllegalArgumentException- 传递非法 ...

  4. java入门第三步之数据库连接

    数据库连接可以说是学习web最基础的部分,也是非常重要的一部分,今天我们就来介绍下数据库的连接为下面学习真正的web打下基础 java中连接数据库一般有两种方式: 1.ODBC——Open Datab ...

  5. 详解Maple中的基础工具栏

    鉴于Maple 强大的符号计算功能,越来越多的人选择使用Maple 2015计算复杂的数学问题,初学者刚开始时需要对Maple有所熟悉才能很好地进行运用,下面就从基础开始,介绍Maple工作环境. M ...

  6. Lesson 2 Breakfast or lunch?

    Text It was Sunday. I never get up early on Sundays. I sometimes stay in bed until lunchtime. Last S ...

  7. 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  8. C#中使用Socket实现简单Web服务器

    上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...

  9. 软件工程(QLGY2015)博客点评总结

    目录 第一次作业(2015.5.9) 第二次作业(2015.5.21) 第三次作业(2015.6.11) 2015上半年软工助教总结 第一次作业(2015.5.9) 存在主要问题 1)书写这种练习博客 ...

  10. java中文乱码解决之道(五)-----java是如何编码解码的

    在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有可能会产生乱码!下面LZ就讲述java在转码过程中是如何来进行编码 ...