首页 > 技术文章 > 第5章 函数

wvqusrtg 2015-07-09 17:52 原文

函数有两种用途:

1.完成指定的任务,这种情况下函数作为调用语句使用;

2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。

  语法:

function func_name (arguments-list)

   statements-list;

end;

 

调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。

print(8*9, 9/8)

a = math.sin(3) + math.cos(10)

print(os.date())

 

上述规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时 候,()是可选的:

print "Hello World"      <-->   print("Hello World")

dofile 'a.lua'              <-->   dofile ('a.lua')

print [[a multi-line        <-->   print([[a multi-line

           message]]                              message]])

f{x=10, y=20}               <--> f({x=10, y=20})

type{}                          <-->   type({})

Lua也提供了面向对象方式调用函数的语法,比如o:foo(x)与o.foo(o, x)是等价的。Lua 使用的函数可以是 Lua 编写也可以是其他语言编写,对于 Lua 程序员来说用什 么语言实现的函数使用起来都一样。

 

 

Lua 函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用 nil 补足。

function f(a, b)

return a or b

end

 

CALL       PARAMETERS

f(3)
         a=3, b=nil

f(3, 4)           a=3, b=4

f(3,4,5)      a=3,b=4 (5isdiscarded)

5.1 返回多个结果值


Lua 函数可以返回多个结果值,比如 string.find,其返回匹配串“开始和结束的下标”(如果不存在匹配串返回 nil)。

Lua 函数中,在 return 后列出要返回的值得列表即可返回多值,如:

s, e = string.find("hello Lua users", "Lua")

print(s, e)          --> 7 9

 

Lua 函数中,在 return 后列出要返回的值得列表即可返回多值,如:

function maximum (a)


local mi = 1             -- maximum index

local m = a[mi]          -- maximum value

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

 

 

5.2 可变参数

Lua 函数可以接受可变数目的参数,和 C 语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。Lua 将函数的参数放在一个叫 arg 的表中,除了参数以外,arg 表中还有一个域 n 表示参数的个数。

例如,我们可以重写 print 函数:

printResult = ""

function print(...)

   for i,v in ipairs(arg) do

       printResult = printResult .. tostring(v) .. "\t"

   end

   printResult = printResult .. "\n"

end

 

 

有时候我们可能需要几个固定参数加上可变参数

function g (a, b, ...) end

CALL          PARAMETER

g(3)                     a=3, b=nil, arg={n=0}

g(3, 4)                  a=3, b=4, arg={n=0}

g(3, 4, 5, 8)        a=3, b=4, arg={5, 8; n=2}

 

 

 

 

 

 

 

 

推荐阅读