lua函数
发布时间:2020-12-14 21:55:13  所属栏目:大数据  来源:网络整理 
            导读:Lua的函数定义一般形式如下: optional_function_scope function function_name( argument1,argument2,argument3...,argumentn)function_bodyreturn result_params_comma_separatedend 在 Lua 编程语言的方法定义包括方法头和方法体。这里是方法的所有部件
                
                
                
            |  
 Lua的函数定义一般形式如下: 
  
 optional_function_scope function function_name( argument1,argument2,argument3...,argumentn)function_bodyreturn result_params_comma_separatedend 
  
  
 在 Lua 编程语言的方法定义包括方法头和方法体。这里是方法的所有部件 
 
  
 一、多重返回值 
  
 lua函数允许返回多个值,lua会根据不同的调用情况调整函数的返回值数量。 
  
 1.函数调用作为一条单独的语句时,lua会丢弃函数的所有返回值。 
  
 2.函数作为表达式的一部分来调用时,lua值保留第一个返回值。 
  
 3.当函数调用作为一系列表达式 中的最后一个元素时,才能获得它的所有返回值。 
  
 4.table构造式可以完整的接收一个函数调用的所有结果,不会有任何数量方面的调整。不过这种行为只有当一个函数调用作为最后一个元素时才会发生,而在其他位置上的函数调用总是只产生一个结果值。 
 
  function fun2() 
 
  return "a","b" 
 
  end 
 
  t1 = {fun2()} 
 
  for i,v in pairs(t1) do 
 
  print(i,v) 
 
  end 
 
 
 
  t2 = {fun2(),"k" } 
 
  for i,v in pairs(t2) do 
 
  print(i,v) 
 
  end 
 
 
 
  5.也可以把函数调用放入一对圆括号中,迫使它只返回一个结果: 
 
  function fun2() 
 
  return "a","b" 
 
  end 
 
  print((fun2())) 
 
  6.unpack函数,它接受一个数组作为参数,并从下标1开始返回该函数的所有元素。 
 
  二、变长参数 
 
  lua函数可以接受不同数量的实参。参数表中的三个点(。。。)表示函数可以接受不同数量的实参。 
 
  通常一个函数在遍历其变长参数时只需使用表达式{。。。},就像访问一个table一样。在某些特殊的情况下,变长参数中可能会包含一下故意传入的nil,那么此时需要用函数select来访问变长参数了。调用select时,必须传入一个固定实参selector(选中开关)和一西丽变长参数。如果selector为数字n,则返回第n个实参。否则selector只能为字符串“#”,这样select函数返回变长参数的总数。 
 
  function foo(...) 
 
  local arg = {...} 
 
  for i =1,select("#",...) do 
 
  local val = select(i,...) 
 
  print(val) 
 
  end 
 
  end 
 
  foo(1,5,6,9,nil,8,87) 
 
 
 
  三、具名实参 
 
  lua的参数传递机制是具有“位置性”的,在调用一个函数时,实参是通过它在参数表中的位置与形参匹配起来的。lua函数不接受具有名称的实参。但是可以将所有的参数组织到一个table中,并将table作为唯一的实参传递给函数。 
 
  四、lua函数的特性 
 
  lua函数是“第一类值”,它与其他传统类型的值具有相同的权利。可以存储到变量中,可以作为实参传递给函数,也可以作为函数的返回值。函数也可以嵌套在另外一个函数中,内部的函数可以访问外部函数中的变量。 
 
  函数和所有其他值一样是匿名的,当讨论一个函数名时,实际上是在讨论一个持有某个函数的变量。因此,一个函数定义,实际上就是一条语句,这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。 
 
  五、closure(闭合函数) 
 
  将一个函数写在另外一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称为“词法域”。 
 
  一个closure是一个函数加上该函数所需访问的所有“非局部的变量”。 
 
  六、尾调用 
 
  “尾调用”就是一种类似goto的函数调用。当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”。 
 
  function f(x) 
 
  return g(x) 
 
  end 
 
  以上这种情况就是尾调用。f在调用完g之后再无其他事情可做。因此,程序不需要返回f函数。所以在“尾调用”之后,程序不需要保存任何关于该函数的堆栈信息。这种实现称为支持“尾调用消除”。由于“尾调用”不会消耗堆栈空间,所以一个程序可以拥有无数嵌套的“尾调用”。需要注意的是,要确保当前的调用是一条“尾调用”。判断的准则是“一个函数在调用完另一个函数之后,是否就无其他事情需要做了”。 
 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 






