首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Lua函数-你可能没有留意的细节都在这里“DaemonCoder”

函数的定义

函数定义的写法如下:

local 指定函数的作用域为局部,不加local表示全局函数。function是关键字,表示声明的是一个函数,func_name自定义的函数名,函数名字可以省略,表示定义的是一个匿名函数(后面可以看到匿名函数的用法)。arg1, arg2为指定函数需要的参数,return指定函数返回。

下面看一个示例:

Lua函数支持多值返回:

函数变量

在之前的文章 Lua 数据类型 中我们提到,Lua的函数和数值、字符串等一样,是一种类型,这就意味着我们可以创建一个值为函数的变量,先看一个示例:

通过个这个示例可以看到:

sum 是用之前介绍的常规方式定义的函数。

sub 是一个变量,值是一个匿名函数,则可以像函数调用的方式来调用 sub 变量。

math 是自定义的一个表,有两个字段 add、sub,这两个字段的值都是函数类型,所以也可以对其进行函数调用:math.add()、math.sub()。

函数传参

Lua的函数,不要求传入的实参个数和形参个数一致。实参个数大于形参个数时,多传入的实参被忽略;实参个数小于形参个数时,不足的参数在函数体中的值为 nil 。

函数参数的值传递、引用传递情况,在和Lua变量的赋值表现是一样的。函数体内如果修改传入参数的值,是否会对调用函数处的值产生影响,不同的类型表现不一致,数值、字符串等不会产生影响,但是修改传入一个表内的字段值时会对原有表产生影响。具体示例可以参考之前的文章 Lua赋值。

默认参数

在C++中,函数参数可以设置默认值,当传入的实参数不足时,就是指定的默认值,写法如下:

对不起,Lua不支持默认参数的写法!这种写法在Lua中会直接语法不通过。

函数重载

熟悉Java的朋友,在很多情况下会用到方法重载,即定义两个名字相同的方法,传入的参数个数或类型不同,根据参数来决定具体是用的哪个方法,示例如下:

如果你也希望Lua函数也支持这样的写法,那可能又要你失望了。对不起,Lua不支持函数重载!但是这种写法不会报错,看下面Lua示例:

定义了两个都叫 overload 的方法,参数个数不同,来达到Java世界里的重载效果,最后调用处传入和第一个定义相匹配的参数,运行后发现其实调用的是第二个方法,参数c是nil。

Lua中定义两个相同名字的函数,没有重载一说,其实是函数的重定义,第二个函数会把第一个覆盖掉,第一个函数定义没有意义。

可变参数列表

Lua是支持可变参数列表的,在函数的最后一个参数定义处用...表示,函数体中...会当作一个表处理,示例如下:

函数声明与调用顺序

函数需要先声明才能调用,先看示例:

第一处被注释的 jump() 处,不能调用 jump(),因为jump方法体中调用了 run(),此时还没有执行到 run 函数的定义处(即:run值为nil),会报错:attempt to call a nil value (global 'run')。

最后调用的 jump() 处,此时 run 函数已经定义过了,所以不会报错,也可以把 run() 放到 jump() 之前,这样就可以在被注释的地方正常调用了。

转载请注明出处,本文原始链接:https://www.daemoncoder.com/a/Lua%E5%87%BD%E6%95%B0/4d546b3d

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191206A0KHR100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券