zoukankan      html  css  js  c++  java
  • lua函数

      一、函数

        在lua中函数的调用方式和C语言基本相同。 如print(“hello world”), z=add(x+y)。唯一的差别是,如果函数只有一个参数,并且该参数是字符串或者table构造器,那么圆括号可以省略,如print “hello world”, f{x=10,y=10}。

       我对于table构造器的理解就是它本身就是一个构造函数或者是特殊化的结构体。

       lua为面向对象也提供了一个新的特殊语法--冒号操作符。表达式o.foo(o,x) 的另一种写法是o:foo(x)。

       function add(a)
          local sum=0
          for i,v in ipairs(a) do
             sum=sum+v
          end
          return sum
       end
       在以上声明中,包含了函数名(add),参数列表(a),以及函数体。需要说明的是,Lua中实参和形参的数量可以不一致,一旦出现这种情况,Lua的处理规则等同于多重赋值,即实参多于形参,多出的部分被忽略,如果相反,没有被初始化的形参的缺省值为nil。

    1、多重返回值

    function maximum(a)
       local pos=1
       local maxx=a[1]
       for i, v in ipairs(a) do
           if v>maxx then
           pos,maxx=i,v
           end
       end
       return pos,maxx
    end
    
    print(maximum( {1,5,2,7,3,6} )) 
    --输出 4 7

    2、变长参数

    lua中同一个函数可以接受不同数量的参数(参数项为 ... )

    function add(...)
      sum=0
      for i,v in pairs{...} do
         sum=sum+v
      end
      return sum
    end
    
    
    function mul(a,b,...)
      sum=a*b
      for i,v in pairs{...} do
         sum=sum*v
      end
      return sum
    end
    
    print(add(1,2,3,4,5))
    print(add(1,2,3))
    print(mul(1,2,3,4,5))

    3、具名实参

    lua中允许将多个参数合并在一个table中,当做一个参数传入

    function foo(person)
      name=person.name
      age=person.age
      sex=person.sex
      ...
    end

    二、深入函数

    在lua中函数和其他所有值一样是匿名的,即它们没有名称,我们在操作的时候都在在操作该函数的变量。

    a = { p = print }
    a.p("Hello World")
    b = print
    b("Hello World")

    函数声明的方式:

    function foo(x) return 2*x  end

    foo=function(x) return 2*x end

    下面展示了匿名函数的方便性

    table.sort(tab,function(a,b) return a.id<b.id end )

    1、closure函数(闭包函数)

    如果一个函数写入另一个函数内,那么这个处于内部的函数可以访问外部函数的局部变量。

    function newCounter()
        local i = 0   --"非局部变量",该变量可以被内部的匿名函数访问并操作
                       --其值可以用于下一次函数访问时计算
        return function() --匿名函数
            i = i + 1
            return i
        end
    end
    c1 = newCounter()
    c2=  newCounter()
    print(c1())
    print(c2()) --不同闭包的“非局部变量“是相互独立的
    print(c1())
    print(c2())
    --输出结果为:
    --1
    --1
    --2
    --2

    为了加深理解,再来看一个例子

    function power(x)
      return function(y) --该参数为闭包变量传入的参数
      return y^x
      end
    end
    
    power2=power(2) --power2,power3为闭包变量
    power3=power(3)
    print(power2(4))
    print(power3(5))
    --输出
    --16
    --125

    2、非全局函数

    Lib={}
    Lib.add=function(x,y) return x+y end
    Lib.sub=function(x,y) return x-y end
    function Lib.add(x,y) return x+y end
    function Lib.sub(x,y) return x-y end
    
    Lib={
          add=function(x,y) return x+y end
          sub=function(x,y) return x-y end
    }
    
    do
       local f=function(x,y) return x+y end
       ...
       f(4,5)
    end
  • 相关阅读:
    BZOJ 1001: [BeiJing2006]狼抓兔子
    BZOJ 1031: [JSOI2007]字符加密Cipher
    BZOJ 1083: [SCOI2005]繁忙的都市
    BZOJ 1034: [ZJOI2008]泡泡堂BNB
    BZOJ 1040: [ZJOI2008]骑士
    BZOJ 1026: [SCOI2009]windy数
    BZOJ 1022: [SHOI2008]小约翰的游戏John
    BZOJ 1018: [SHOI2008]堵塞的交通traffic
    BZOJ: 2819 Nim
    bzoj 3144
  • 原文地址:https://www.cnblogs.com/kane0526/p/3982588.html
Copyright © 2011-2022 走看看