码迷,mamicode.com
首页 > 其他好文 > 详细

Lua函数

时间:2015-10-02 14:55:07      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

  1. Lua中的函数和其他值一样都是匿名的,其实函数就是值,而函数名就是一个持有某函数的变量。

function foo()
    print("foo")
end

等价于

foo = function (x)
    print("foo")
end

可以将 function (x) <body> end 看做是函数的构造式,称为匿名函数

 

  2.高阶函数:接收其他函数作为实参的函数

function foo(f, delta)
     delta = delta or 1e-4;
     return function (x)
         return function()
             return (f(x+delta) - f(x)) / delta;
         end
     end
end    

local c = foo(math.sin)(30)();    --可以看见return的function 越深,需要()越多
print(math.cos(30), c);

 

  3.闭合函数(closure):一个closure就是一个函数加上该函数所需访问的所有“非局部的变量(upvalue)”(函数是closure中的一种)

function foo()
     local i = 0;
     return function()
         i = i + 1;
         return i;
     end
end

print(foo()(), foo()()); --1 1
local f1 = foo();
local f2 = foo();
print(f1(), f2(), f1(), f1(), f2());  --1 1 2 3 2

可以看见,每次foo()都是一个新的closure,对于f1和f2,都是独立的closure。
在f1和f2中,就像是他们都有i这个域,一开始的 i = 0 在foo()这句话中已经执行了,后面每次执行的是 return function 这句话

 

  4.多重返回值

function foo()
    local x = 10;
    local y = 23;
    return x, y;
end

a, b = foo(); --a = 10, b = 23;

 多个返回值只发生在该函数式是一系列表达式中的最后一个元素,否则只返回第一个值(也可以使用圆括号来迫使返回一个值)

 

  5.变长参数 (...)

 

  6.具名实参:用table作为参数

 

  7. 尾调用:调用函数foo后没有其他操作。尾调用不耗费任何栈空间。

正确的调用形式:return <func>(<args>)

不是尾调用的例子:

return g(x) + 1;
return x or g(x)
return (g(x)) --这个最容易忽略

常用地方:状态机,递归层次深的算法。

 

  小知识点:(1)当参数只有一个时,无需写圆括号

       (2)Coo:foo(x) 等价于 Coo:foo(x),冒号可以将Coo默认为第一个参数(常用在类的实现中)

       (3)传入的实参少于形参,则少的以nil为值;若实参多于形参,则多余的舍弃(多重返回值也是同样的道理)

 

Lua函数

标签:

原文地址:http://www.cnblogs.com/programmer-kaima/p/4852193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!