Lua 函数定义与使用

Lua 函数

在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。

Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。

Lua 函数主要有两种用途:

  • 1.完成指定的任务,这种情况下函数作为调用语句使用;

  • 2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。


函数定义

Lua 编程语言函数定义格式如下:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
	function_body	return result_params_comma_separatedend


解析:

  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字local

  • function_name:指定函数名称。

  • argument1, argument2, argument3..., argumentn:函数参数,多个参数以逗号隔开,函数也可以不带参数。

  • function_body:函数体,函数中需要执行的代码语句块。

  • result_params_comma_separated:函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

  • 实例

    以下实例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值:

    --[[ 函数返回两个值的最大值 --]]function max(num1, num2)
    
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
    
       return result; end-- 调用函数print("两值比较最大值为 ",max(10,4))print("两值比较最大值为 ",max(5,6))

  • 以上代码执行结果为:

    两值比较最大值为 	10两值比较最大值为 	6

  • Lua 中我们可以将函数作为参数传递给函数,如下实例:

    myprint = function(param)
       print("这是打印函数 -   ##",param,"##")endfunction add(num1,num2,functionPrint)
       result = num1 + num2   -- 调用传递的函数参数
       functionPrint(result)endmyprint(10)-- myprint 函数作为参数传递add(2,5,myprint)

  • 以上代码执行结果为:

    这是打印函数 -   ##	10	##这是打印函数 -   ##	7	##


  • 多返回值

    Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。

    > s, e = string.find("www.runoob.com", "runoob") > print(s, e)5	10

  • 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, miendprint(maximum({8,10,23,12,5}))

  • 以上代码执行结果为:

    23	3


  • 可变参数

    Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。

    Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。

    例如,我们计算几个数的平均值:

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v   end
       print("总共传入 " .. #arg .. " 个数")
       return result/#argendprint("平均值为",average(10,5,3,4,5,6))

  • 以上代码执行结果为:

    总共传入 6 个数平均值为	5.5

2019-05-04 23:45

知识点

  • Lua
  • 相关教程

    更多

    Lua 异常处理

    
                                

    Lua 模块管理

    
                                

    Lua Debug调试

    
                                

    Lua 迭代器iterator

    
                                

    Lua 快速入门

    
                                

    Lua循环遍历

    
                                

    Lua 变量声明与使用

    
                                

    Lua 基本数据类型

    
                                

    Lua 垃圾回收机制

    
                                

    Lua 文件 I/O 操作

    
                                

    Lua 元表(Metatable)改变table的行为

    
                                

    Lua table(表、数组、字典)

    
                                

    Lua 面向对象编程

    
                                

    Lua 字符串操作

    
                                

    Lua 协同程序(coroutine)-类型线程

    
                                

    最新教程

    更多

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    redis从库只读设置-redis集群管理

    默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

    Netty环境配置

    netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

    Netty基于流的传输处理

    ​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

    Netty入门实例-使用POJO代替ByteBuf

    使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

    Netty入门实例-时间服务器

    Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

    Netty入门实例-编写服务器端程序

    channelRead()处理程序方法实现如下

    Netty开发环境配置

    最新版本的Netty 4.x和JDK 1.6及更高版本

    电商平台数据库设计

    电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

    HttpClient 上传文件

    我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

    MongoDB常用命令

    查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

    快速了解MongoDB【基本概念与体系结构】

    什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    windows系统安装MongoDB

    安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

    Spring boot整合MyBatis-Plus 之二:增删改查

    基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    import com.baom

    分布式ID生成器【snowflake雪花算法】

    基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案