Lua学习笔记04:Lua函数简介

Lua函数
一、在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。
Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。
Lua 函数主要有两种用途:
1.完成指定的任务,这种情况下函数作为调用语句使用;print("Hello World")
2.计算并返回值,这种情况下函数作为赋值 语句的表达式使用。a=math.sin(3)+math.com(10)
无论哪种用途,都要将参数放在括号中,如果参数是一个自变字符串或table构造式的话,则也可以不把参数放在括号中
print "Hello World"    print{1,2,3}
即使调用参数时没有调用任何参数,也要加括号

二、函数定义 
function 函数名(参数名(形参)) 
代码块 
return 变量名或表达式
end
调用函数时提供的参数数量可以与形参数量不同,Lua会自动调整实参的数量以匹配参数表的要求(若实参多于形参,则Lua会自动舍弃掉多余的实参;若实参少于形参,则多出来的形参会自动初始化为nil)
Lua函数若无传递任何参数给形参,则也可以在函数内部设置默认的实参
function ia(a)
a=a or 1
count=count+1
end

三、多重返回值:Lua允许函数返回多个结果
例:string.find()-->该函数有两个参数,第一个为字符串变量,第二个为需要查找的字符串;其返回结果为第二个字符串在第一个字符串中的初始位置和结束位置,若无法在第一个字符串中找到第二个字符串,则返回nil
自定义返回一个数组中最大的索引和值:
function maxNum(a)
  local mi=1
  local m=a[mi]
  for i,v in ipairs(a) do
      if v>m  then
         mi=i m=v
      end
  end
  return mi,m
end
1、Lua会调整返回值的数量来适应不同的情况,如果把函数调用当作单独的语句来使用,则Lua会丢弃该函数的全部返回值;如果把一个函数作为表达式的一部分使用时,Lua只会保留该函数的第一个返回值;只有当一个函数调用是一系列表达式中的最后一个元素,并且值是只有一个元素时,才能获得该变量的所有返回值(若一个函数有多重返回值,想要一次获取该函数的全部返回值,可以使用多重赋值的方式来获取该函数的全部返回值)
例 print(maxNum({8,9,10}).."a")-->由于maxNum不是表达式中的最后一个元素,所以该结果只会返回maxNum()方法中的第一个返回值和字符串"a"。
2、在多重赋值中,如果一个函数调用是表达式最后或仅有的一个表达式,Lua则会保留其尽可能多的返回值,用于匹配赋值的变量;如果一个函数表达式不是放在表达式最后,且表达式的值多于或等于要赋值的变量数,Lua只会保留该函数的第一个返回值并将它赋值给变量
3、如果把一个函数赋值给一个变量时,该函数没有返回值或没有足够多的返回值时,Lua会用nil来补充缺失的返回值,将nil赋值给变量
4、如果当一个函数A调用作为另一个函数B调用的最后一个实参时,函数A的所有返回值都会作为实参传入第二个函数B,否则A函数只会返回一个值作为B函数的一个实参
5、print()函数可以接受不同数量的实参
6、如果一个多重返回值的函数位于table构造式的最后一个元素的位置,则table构造式可以保存该函数的全部返回值,否则只能保存该函数的一个返回值
7、如果将一个多重返回值的函数添加到"()"中,则该函数只会返回一个值;一般return语句后面的返回值不需要加括号,如果添加了括号则可能会有不同的返回结果
8、unpack()函数:该函数接收一个数组,并且从该数组的下标索引"1"开始返回该数组的所有元素。其可以有效的用于泛型调用的机制中
泛型调用机制可以以动态的实参来调用任何函数
例:
a={"hell0","ll"}
f=string.find
f(unpack(a))-----变量f相当于函数string.find(),同时将unpack方法的返回值传递给了string.find();相当于string.find("hello","ll")
print(f(unpack(a)))
四、变长参数:Lua中的函数可以接收不同数量的实参
function 方法名(...)--->括号中的"..."表示该函数可以接收多个不同数量的实参
    代码块
    return 返回值
end

function add(...)
  local s=0
  for  i,v  ipairs{...}("..."代表变长参数,该参数会将参数收集起来) do
    s=s+v
  end
  return s
end
1、string.format():用于格式化文本的函数
     io.write():用于输入文本的函数
2、变长参数必须放在一个函数的所有形参的最后一个位置;Lua会把所有的实参按位置和数量分配给前面的形参,若还有多的实参则会分配给最后的变长参数
3、若一个函数的形参为变长参数,且在函数中将该形参进行多重赋值时,变量会根据变长参数的数量来进行赋值,未赋值的变量将自动赋nil值。
4、通常一个函数在遍历变长参数时,只需要使用表达式"..."即可(return ...)
5、然而在某些特殊情况下,变长参数中可能会包含一些故意传入的参数nil,这时就需要用到函数select()来访问变长参数在调用select()函数时必须传入一个固定的实参"select(选择开关)"和一系列的变长参数,如果实参select为nil值的话那么select方法会返回第n个可变的实参,否则实参select的值只能为字符串"#",这样方法select()会返回变长参数的总数

五、具名参数:Lua中的参数传递机制是具有位置性的,即实参是根据其在参数表中的位置与形参进行匹配(第一个实参须与第一个形参相匹配、第二个实参须与第二个形参相匹配、以此类推);但有时候也可以通过名称来指定实参
例:
os.rename()函数用于修改文件名 ,若有时忘记了该函数要修改名和修改名的形参位置时,可以用一个table来代替:
os.rename{old="abc.lua",new="temp.lua"}
若一个函数中有许多参数,就可以用这种具名参数的方法来对方法中的部分形参进行赋值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值