0基础lua学习(七)函数
函数
1) 函数定义
函数是封装和抽象块的主要机制。函数的主要功能就是在内部封装一些需要的功能模块
,并且对外只开发函数与的名称和参数。Lua中函数的定义和其它语言基本一致。
function func()
end
也可以这样function func()end
Lua 编程语言函数定义格式如下:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
解析:
-
optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字local。
-
function_name: 指定函数名称。
-
argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
-
function_body: 函数体,函数中需要执行的代码语句块。
-
result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
-- 函数返回两个值的最大值 --
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))
console:
两值比较最大值为 10
两值比较最大值为 6
2) 函数参数与返回值
a)返回值
lua中函数可以有任意多个参数,当传递参数超过了形参个数,那么多余的参数就会被丢弃
lua中如果函数返回多个参数,所赋值的表达式 不是最后一个元素
例子 一 多返回值
function foo()
return 3,4
end
x,y =foo()
此操作相当于x =3 ,y=4
例子二 多返回值
s, e = string.find("www.csdn.com", "csdn")
print(s, e)
console:5 10
例子三 多返回值
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, mi
end
print(maximum({8,10,23,12,5}))
console:23 3
b)多参数
lua中函数也可以接受数量不定的实参
例子一 函数两个参数
--[[ 函数返回两个值的最大值 --]]
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))
console:两值比较最大值为 10
两值比较最大值为 6
例子二 多参数函数
myprint = function(param)
print("这是打印函数 - ##",param,"##")
end
function add(num1,num2,functionPrint)
result = num1 + num2
-- 调用传递的函数参数
functionPrint(result)
end
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)
console:这是打印函数 - ## 10 ##
这是打印函数 - ## 7 ##
例子三 变参
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
console:
总共传入 6 个数
平均值为 5.5
补充:
return返回一个函数的返回值,需要注意return f()会把f()反回的所有返回值都返回?
而return(f())会迫使它只能返回一个结果
关于多重返回值还有一个特殊的函数unpack,它接受一个数组作为参数,并从下表1开始返回
该数组所有元素
print(unpack{10,20,30})
a,b = unpack{10,20,30} --30被丢弃
unpack经常用于函数参数传递
a ={"hello","11"}
string.find(unpack(a))
4) 闭包函数
-- 闭包函数是指一个函数写在另一个函数里,这个位于内部的函数
--可以访问外部函数中的局部变量。(具体以后会详细说明)
function newCounter()
local i = 0
return function()
i = i +1
return i
end
end
c1=new newCounter()
print(c1)
print(c1)
console:
nil
nil
5)在面向对象的编程,lua中怎么定义?(具体以后会详细说明)
class = {} --一个对象
function class.func1()
end
function class:fun2()
end
首先顶一个了一个class的table,然后在table上定义了两个函数成员,func1 和fun2使用了不同的方法
.和:区别?
lua中用":"会传入一个名为self的变量,self同C++ this一样,表示当前对象的指针
"."定义的函数没有self
fun1和fcun2 用如下方式等价起来!!!!!!!!!!!!!
function class.fun1(self) end
function class:fun2()end --传入一个self作为参数