函数的定义:在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. grunt 单独压缩多个js和css文件【转】

    原文地址:http://xiaomiya.iteye.com/blog/2177877 使用grunt来压缩前端js,css文件 因为最近做的客户端本地项目有用到十几个js,js提交之前都需要压缩.用 ...

  2. RunLoop(基本操作)

    基本概念 -(void)runTimerInThread { //NSAutoreleasePool,没的用 [NSTimer scheduledTimerWithTimeInterval:1.0 t ...

  3. [LintCode] Intersection of Two Linked Lists 求两个链表的交点

    Write a program to find the node at which the intersection of two singly linked lists begins. Notice ...

  4. Ubuntu下安装mod_python报错(GIT错误)

    Ubuntu下安装mod_python3.4.1版本报出如下错误: writing byte-compilation script '/tmp/tmpE91VXZ.py' /usr/bin/pytho ...

  5. hibernate不同版本获取获取sessionFactory

    hibernate4时,我们采用以下方式获取会话工厂: // 1. 解析我们在hibernate.cfg.xml中的配置 Configuration configuration = new Confi ...

  6. Unity自动寻路Navmesh之高级

    隔离层自动生成寻路网格 (源码scene1.unity) 1.创建Plane实例P1,P2,两者之间出现一条鸿沟.直接控制角色位移是无法通过的. 2.打开Navigation窗口,分别选中P1,P2, ...

  7. spring mvc + ehcache 利用注解实现缓存功能

    我的spring是3.1的,因为项目需求,需要在查询时候加上缓存,小白一个,完全没有用过缓存(ehcache),摸索了一天终于会了一点通过注解来使用ehcache进行缓存,立刻给记录下来. 首先 我的 ...

  8. sql编写将时间转换年月日 时分格式

    SELECT SUBSTRING(CONVERT(varchar(100),时间字段, 22),0,15) AS aa  FROM  表名

  9. IDT HOOK思路整理

    IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...

  10. python serial 获取所有的串口名称

    http://blog.csdn.net/qq61394323/article/details/44619511 #!/usr/bin/env python # -*- coding: utf-8 - ...