Lua语法基础知识讲解(下篇)!收藏版

今天说讲是上回的延续,Lua语法基础知识讲解下篇,大家如有收获可以收藏...

9.函数

9.1 初识函数

函数是指一段在一起的、可以做某一件事儿的程序,也叫做子程序。

在前面的内容中,我们已经接触过了函数的调用,这个函数就是前面用到了很多次的print(...)。

调用函数只需要按下面的格式即可:

函数名(参数1,参数2,参数3,......)

为何要使用函数?因为很多事情都是重复性操作,我们使用函数,可以快速完成这些操作

下面我们举一个最简单的函数例子,这个函数没有传入参数、没有返回值

它实现了一个简单的功能,就是输出Hello world!:


function hello()

   print('Hello world!')

end

这个函数名为hello,我们可以按下面的方法进行调用(执行):


function hello()

   print('Hello world!')

end

hello()

 这行代码会输出Hello world!。

同时,在Lua中,函数也是一种变量类型,也就是说,hello实际上也是一个变量,里面存储的是一个函数,我们可以用下面的代码来理解:


function hello()

   print('Hello world!')

end

a = hello

--把hello函数同时赋值给a变量

a()

hello()

--a和hello变量指向同一个函数

--所以执行结果和hello()相同

因为函数只是个变量,你甚至在一开始可以这样声明hello函数:


hello = function()

   print('Hello world!')

end

hello()

下面你需要做一件简单的事情:

  • 新建一个函数变量biu,使其执行后会打印biubiubiu这个字符串

  • 新建一个函数变量pong,使其与biu指向的函数相同


--请在此处补全代码

--请使下面的调用可以正常打印出biubiubiu

biu()

pong()

print("biu和pong相等吗?",biu==pong)

9.2 local变量

之前我们创建的变量,都是全局变量,这种变量在代码运行周期从头到尾,都不会被销毁,而且随处都可调用。

但是当我们代码量增加,很多时候大量新建全局变量会导致内存激增,我们需要一种可以临时使用、并且可以自动销毁释放内存资源的变量,要怎么解决呢?

我们可以使用local标志来新建临时变量,使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。

参考下面的代码:


a = 123

function add()

   local n = a+2

   print(n)

end

add()

print(n)

上面的代码中,n就是一个局部变量,它只在这个funcion中有效,并且函数运行完后会自动回收这部分的内存。

我们应该尽可能的使用局部变量,以方便lua虚拟机自动回收内存空间,同时减少资源占用提高运行速度。

下面请阅读以下代码,思考一下,正确的输出结果是什么:


str = 'abc'

function connect()

   local s = str..'def'

end

print(s,str)

9.3 函数参数

在前几章的使用中,我们知道函数是可以传入参数的,如print(123)

那么,我们如何编写可以传入参数的函数呢?可以按下面的模板来写


function 函数名(参数1,参数2,...)

   代码内容

end

这里传入的参数,等价于在函数内部新建了一个local的变量,修改这些数据不会影响外部的数据(除了后面还没有讲到的table等类型)

举个例子,比如下面的函数,可以实现打印出两个传入值的和:


function add(a,b)

   print(a+b)

end

add(1,2)

--会输出3

这段代码其实等价于:


function add()

   local a = 1

   local b = 2

   print(a+b)

end

add()

下面问题来了,请设计一个函数p,可以按下面的调用方式来打印出物体的密度:


--补全这个函数的代码,满足题目要求

function p(a,b,c,m)

   print()

end

--一个长方体的长宽高分别为a、b、c(单位米)

a = 1

b = 2

c = 3

--这个物体重量为m(单位克)

m = 230

--下面打印出密度

--注:密度计算公式 密度 = 质量 / 体积

p(a,b,c,m)

9.4 函数返回值

在前面的代码中,我们实现了一个函数,输入变量a、b,函数会自动输出两个数值的和。

但是一般来说,我们的需求远远不止这些,我们可能需要一个如下功能的函数:

执行函数,输入两个值,获取这两个值的和

如果还是按上面几节的内容,我们只会输出这个值,并不能把这个值传递给其他的变量进行后续使用,如何解决这个需求呢?

我们可以使用函数的返回值来实现这个需求,结合上面的需求,我们可以用下面的代码实现:


function add(a,b)

   return a+b

end

all = add(1,2)

--这里all的值就是3了

print(all)

这里的return表示返回一个值,并且立刻结束这个函数的运行

同时,和输入值可以有多个一样,返回值也可以有多个


function add(a,b)

   return a+b,"ok"

end

all, result = add(1,2)

--这里all的值就是3了

--这里result的值就是string "ok"

print(all,result)

下面问题来了,请设计一个函数p,可以按下面的调用方式来返回出物体的密度,返回值为number类型:


function p(a,b,c,m)

   --请补全代码

end

--一个长方体的长宽高分别为a、b、c(单位米)

a = 1

b = 2

c = 3

--这个物体重量为m(单位克)

m = 230

--下面返回密度值

--注:密度计算公式 密度 = 质量 / 体积

result = p(a,b,c,m)

print(result)

9.5 判断三角形合法性2(自测题)

你需要使用前面几章的知识,来完成下面的题目

  • 已知三个number类型的变量,分别代表三根木棒的长度

  • 请判断,使用这三根木棒,是否可以组成一个三角形(两短边之和大于第三边)

  • 请新建一个函数triangle,并可以用如下形式调用(如果可以组成,就返回true):


function triangle(a,b,c)

   --请补全代码

end

result = triangle(1,2,3)--传入值为三边长度,多改几个测试下

print(result)

9.6 返回多个值(自测题)

你需要使用前面几章的知识,来完成下面的题目

  • 已知2个number类型的变量,分别代表一个长方体的长和宽

  • 请计算这个长方形的周长和面积

  • 请新建一个函数rectangle,并可以用如下形式调用:


function rectangle(a,b)

   --补全代码

end

area,len = rectangle(1,2)

--结果:

--面积area为2

--周长len为6

print(area,len)

10.table

10.1 认识数组

数组,使用一个变量名,存储一系列的值

很多语言中都有数组这个概念,在Lua中,我们可以使用table(表)来实现这个功能

在Lua中,table是一个一系列元素的集合,使用大括号进行表示,其中的元素之间以逗号分隔,类似下面的代码:


t = {1,3,8,5,4}

我们可以直接使用元素的下标,来访问、或者对该元素进行赋值操作。

在上面的table变量t中,第一个元素的下标是1,第二个是2,以此类推。

我们可以用变量名+中括号,中括号里加上下标,来访问或更改这个元素,如下面的例子:


t = {1,3,8,5,4}

print(t[1]) --打印1

print(t[3]) --打印8

t[2] = 99 --更改第二个元素的值

print(t[2]) --打印99

t[6] = 2 --凭空新
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值