《lua 程序设计》在线阅读:http://book.luaer.cn/
function func_name (arguments-list) statements-list; end;示例
function foo (x) return 2*x end foo = function (x) return 2*x end从上面我们可以看出lua函数定义实际上是一个赋值语句,将类型为function的变量赋给一个变量,需注意:
print "Hello World" <--> print("Hello World")
function foo0 () end -- returns no results function foo1 () return 'a' end -- returns 1 result function foo2 () return 'a','b' end -- returns 2 results需注意返回多个值是:
x,y = foo2() -- x='a', y='b' x,y = foo1(); -- x = 'a', y= nil x = foo2() -- x='a', 'b'舍去 x,y = foo2(), 20 -- x='a', y=20另外,括号可以强制返回一个值
print((foo2())) --> a
function fn(name,nick,...) print(name,nick) -- 一撮毛 大帅锅 for i,v in ipairs(arg) do print(arg[i]) -- 1,2,3,4 end end fn("毛毛","大帅锅",1,2,3,4); -- name="毛毛",nick="大帅锅",arg={1,2,3,4; n = 4}
function fn() local i = 0 return function() -- 注意这里是返回函数的地址,不是执行 i = i + 1 return i end end c1 = fn() -- 接收函数返回的地址 print(c1()) --> 1 --c1()才表示执行 print(c1()) --> 2如上,调用c1()时,fn函数明显已经返回,lua闭包闭包思想正确处理这种情况:
c2 = fn() print(c2()) --> 1 print(c1()) --> 3 print(c2()) --> 2
例如:
function f(x) return g(x) -- 类似于goto g(x)函数的地址 end
例如下面调用不论n为何值不会导致栈溢出。
function foo (n) if n > 0 then return foo(n - 1) end end需要注意的是:必须明确什么是尾调用。
function f (x) g(x) return end上面这个例子中f在调用g后,不得不丢弃g地返回值,所以不是尾调用,同样的下面几个例子也不时尾调用:
return g(x) + 1 -- 还需+1 return x or g(x) -- 还需比较 return (g(x)) -- 还需调整为一个返回值
原文地址:http://blog.csdn.net/shun_fzll/article/details/38757673