zoukankan      html  css  js  c++  java
  • Lua 函数(四)

    Lua的函数

      在Lua中如果一个函数只有一个参数,并且此参数是一个字面字符串或table构造式,那么圆括号便是可有可无的。

      例如:print "hello world" <----> print("hello world")

      冒号操作符:表达式:o.foo(0,x) 可以写成是:o:foo(x) 

    5.1 多重返回值:

      lua具有一项非常与众不同的特征,允许函数返回多个结果。

      写一个函数用于查找数组中的最大元素,并返回该元素的位置

      function maxinmum(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}))  --> 23 3

        x,y,z=10,foo2()  ---x=10,y=a,z=b

      当函数出现在一个表达式中的时候,返回值数量调整为1

      例如:print(foo2() .. "x")   --->ax

      table 构造是可以完整地接受一个函数调用的所有结果,即不会有任何数量方面的调整

      t={foo2()}   --->t={"a","b"}

      不过,这种行为只有当一个函数调用作为最后一个元素时才会发生,而其他位置上的函数调用总是只产生一个结果值

      t={foo0(),foo2(),foo3()}   -->t[1]=nil,t[2]="a",t[3]=4

      最后一种情况是return语句,诸如return f() 这样的语句将返回f的所有返回值

      function foo(i)

        if i==0 then return foo0()

        elseif i==1 then return foo1()

        elseif i==2 then return foo2()

        end

      end

      print(foo(1))

      关于多重返回值还要介绍一个特殊函数---unpack.他接受一个数组作为参数,并从下表1开始返回该数组的所有元素

      print(unpak{10,20,30})   ---> 10 20 30

      a,b=unpak{10,20,30}    ---> a=10 ,b =20 ,30 被丢弃

      unpack 的一项重要用途体现在“泛型调用(generic call)”机制中

      例如:f=string.find

         a={"hello","ll"}

         if(unpack(a)) 将返回3和4,这与直接调用string.find("hello","ll") 所返回的结果一模一样。

        虽然,这个预定义函数unpack是用C语言编写的,但是仍然可以在Lua中通过递归实现一样效果:

          function unpack(t,i)

            i=i or 1

            if t[i] then 

              return t[i] , unpack(t , i+1)

            end

          end

          第一次调用时传入一个是参数,此时i=1,然后,函数返回t[1] 与 unpack(t,2)调用的结果,后者又将返回t[2] 与 unpack(t,3) 的结果,一次类推。直至遇到第一个nil元素停止递归。

    5.2 变长参数

      lua中的函数可以接受不同数量的实参。例如,在调用print时可以传入一个,二个或者多个实参。虽然print使用c语言编写的,但也可以用lua编写出这种能接受不同数量实参的函数。

      下面是一个简单的例子,这个函数返回了所有参数的总和:

        function add(...)

          local s = 0

            for i,v in ipairs{...} do

              s=s+v

            end

            return s

           end

        print(add(3,4,10,25,12)) --->54

        参数中3个点(...) 表示该函数可接受不同数量的参数。当这个函数被调用时,他的所有参数都会被收集到一起。这部分收集起来的实参成为这个函数的“变长参数” 。一个函数要访问它的变长参数时,仍需用到3个点(...).但不同的是,此时这3个点是作为一个表达式来使用的。在上例中,表达式{...}表示一个有所有变长参数构成的数组。而函数add遍历了该数组,并累加了每个元素。

        表达式“...”的行为类似于一个具有多重返回之的函数,它返回的是当前函数的所有变长参数。例如:

          local a,b=...

          上例用第一个和第二个变长参数来初始化这两个局部变量。实际上,还可以通过变长参数来模拟Lua中普通的参数传递机制,例如:

        function foo(a,b,c)

        可以转换为:

          function foo(...)

          local a,b,c =...

          end

        下面示例演示了,如何使用select来遍历一个函数的所有变长参数:

          for i=1,select ('#',...) do

          local arg=select(i, ... )   ---得到第i个参数

            《循环体》

          end

        需要特别指出,select(“#”, ... ) 会返回所有变长参数的总和,其中包括nil

      

      

  • 相关阅读:
    进制转换
    体验mssql-cli
    从Windows迁移SQL Server到Linux
    CentOS7脱机安装SQL Server 2017
    基础知识:数据类型优先级
    SQL Server 2016正式版安装(超多图)
    制造高CPU使用率的简单方法
    SQL Server启动的几种方法
    SQL Server 2016 RC0 安装(超多图)
    机器学习:Python实现单层Rosenblatt感知器
  • 原文地址:https://www.cnblogs.com/finger/p/2495255.html
Copyright © 2011-2022 走看看