Lua 学习笔记(五)函数

时间:2023-02-17 07:33:03

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

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

-- body
     end

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

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. [转]LUA 学习笔记

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

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

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

  7. Lua 学习笔记(一)

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

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

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

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

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

  10. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

随机推荐

  1. jquery easyui菜单树显示

    目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了. 效果体验:http://hovertree.com/texi ...

  2. <%%>标签 什么意思

    <%%>是说这里面的文本不是普通直接输出到客户端的文本,而是需要服务器来解释的.不光是可以写JAVA脚本,这要看具体服务器端使用的是什么技术ASP/JSP/PHP/ASP.NET都使用相同 ...

  3. Linux下 RabbitMQ的安装与配置

    以下教程摘录自互联网并做了适当修改,测试的rabbitmq 版本为:rabbitmq-server-generic-unix-3.5.6 各版本之间会有差异!!! 一  Erlang安装 Rabbit ...

  4. 微信wap开发,页面显示元素不全-微信开发(asp&period;net)

    最近在开发的微信的微商城,出现这样一种情况: pc上浏览正常,但是一到手机上浏览就会缺少部分元素 解决办法: 找了很多原因,还通过uc浏览器把网页到存下来了,发现并没有缺少元素,只是没有显示出来,后来 ...

  5. PHP文件系统概述

    >> 本文固定链接: http://php.ncong.com/php_course/file/wenjianxitong.html >> 转载请注明: 恩聪php 2014年 ...

  6. Ucenter注册后,需要二次登录才能同步登录的解决方案

    1. 打开配置文件config.inc.php 在根目录data目录下最下方定义 define('DZ_DBTABLEPRE', '你的表前缀'); 2.打开uc_server/model/user. ...

  7. C-Free 您不能使用调试解决方案

    什么时候C-Free 当您调试 找不到gdb.exe解决方案 http://www.programarts.com/ C-Free 官方网站 下载Mingw或者其他编译器 版权声明:本文博主原创文章. ...

  8. 【面向对象设计原则】之接口隔离原则&lpar;ISP&rpar;

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  9. 在Windows 10上利用seafile搭建个人云服务

    参考seafile官方文档 安装Python 2.7.11 32位版 下载地址:https://www.python.org/downloads/release/python-2711/ 选择 32位 ...

  10. 帝国CMS Table '&ast;&ast;&ast;&period;phome&lowbar;ecms&lowbar;news&lowbar;data&lowbar;' doesn't exist

      帝国CMS刷新内容页出现以下错误 1 Table 'www.536831.com.phome_ecms_news_data_' doesn't exist select keyid,dokey,n ...