https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往

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作为参数



posted @ 2017-10-24 17:35  鱼酱  阅读(166)  评论(0编辑  收藏  举报

https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往