脚本进阶教程 位置导航:首页 > 资料中心 > 脚本进阶教程
   脚本语法说明—函数

概述
多重返回值
变长参数


概述

函数的用途有:
     完成指定的任务,这种情况下函数作为调用语句使用;
     计算并返回值,这种情况下函数作为赋值语句的表达式使用。

语法
function func_name (arguments-list)
  statements-list;
end;

调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
Eg:
  uPrintf(8*9, 9/8)
  a = uSin(3) + uCos(10)
备注:当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选的。
Eg:
  uPrintf "Hello World"     <-->      uPrintf("Hello World")

UL函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
备注:形参,即函数定义时参数表中的参数;实参,即调用函数时传入的参数。



多重返回值

UL函数可以返回多个结果值,比如uModf,其返回匹配串“开始和结束的下标”
Eg:
  a,b = uModf(3.14)
  uPrintf  (a, b)               --> 3  0.14

UL函数中,在return后列出要返回的值的列表即可返回多值.
Eg:
  function maximum ()
   local mi = 10                        -- maximum index
   local m =8                      -- maximum value
   return m, mi
  end
 uPrintf  (maximum())          --> 8 10

UL总是调整函数返回值的个数去适用调用环境,当作为一个语句调用函数时,所有返回值被忽略。假设有如下三个函数:
Eg:
  function foo0 () end                    -- 无返回值
  function foo1 () return ’a’ end              -- 返回一个值
  function foo2 () return ’a’,’b’ end           -- 返回两个值

当作为表达式调用函数时,有以下几种情况:
? 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
? 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
Eg:
  x,y = foo2()         -- x=’a’, y=’b’
  x = foo2()         -- x=’a’, ’b’ 被舍弃
  x,y,z = 10,foo2()        -- x=10, y=’a’, z=’b’
  x,y = foo0()         -- x=nil, y=nil
  x,y = foo1()         -- x=’a’, y=nil
  x,y,z = foo2()        -- x=’a’, y=’b’, z=nil
  x,y = foo2(), 20        -- x=’a’, y=20
  x,y = foo0(), 20, 30       -- x=’nil’, y=20, 30 被舍弃

函数调用作为函数参数被调用时,和多值赋值是相同。
Eg:
  uPrintf  (foo0())        -->
  uPrintf  (foo1())        --> a
  uPrintf  (foo2())        --> a  b
  uPrintf  (foo2(), 1)       --> a  1
  uPrintf  (foo2() .. "x")       --> ax

函数调用在表构造函数中初始化时,和多值赋值时相同。
Eg:
  a = {foo0()} -- a = {} (an empty table)
  a = {foo1()} -- a = {’a’}
  a = {foo2()}         -- a = {’a’, ’b’}
  a = {foo0(), foo2(), 4}       -- a[1] = nil, a[2] = ’a’, a[3] = 4



变长参数

UL函数可以接受可变数目的参数。UL将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
Eg:
  uPrintfResult = ""
  function uPrintf(...)
    for i,v in ipairs(arg) do
    uPrintf  Result = uPrintf  Result .. uTostring(v) .. "\t"
  end
    uPrintf  Result = uPrintf  Result .. "\n"
  end
l

.
公司介绍  |  由我博客  |  招聘信息  |  商务合作 |  媒体合作  |  联系我们  |  新浪微博  |  开心多尼
优万科技(北京)有限公司 版权所有 京ICP证08336号 ISBN 978-7-900648-32-7 《网络文化经营许可证》编号:文网文[2009]076号 新出网证(京)字099号
Copyright (C)2007-2010 UOneNet CO., LTD. All Rights Reserved.