首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Lua基础 函数(2)

2013-03-27 
Lua基础 函数(二)在Lua中,你可以像使用number和string一样使用function。可以将function存储到变量中,存储

Lua基础 函数(二)

在Lua中,你可以像使用number和string一样使用function。可以将function存储到变量中,存储到table中,可以当作函数参数传递,可以作为函数的返回值。


在Lua中,function跟其他值一样,也是匿名的。function被作为一个值存储在变量中,下面这个例子有点2,可以帮助理解:

function f (x) return g(x) end

Lua是怎么处理尾调用的呢。像C语言的话,上面代码中,f对g调用后,g执行完毕后,会返回到g的被调用处。但是在Lua中,这是一个尾调用,g执行完毕之后,会直接返回到f的被调用处。这样的话,可以节省很多堆栈空间。因此像下面这个函数,就不需担心n太大的话会有溢出。


在Lua中,对尾调用的一个很好的应用是状态机。可以用一个函数表示一个状态,改变状态就是跳转到一个指定的函数。下面我们用一个简单的迷宫程序示例:迷宫有几个房间(我们这里是4个),每个房间有4扇门,通向东,南,西,北。每一步,玩家指定一个移动的方向,如果这个方向有门,那么就进入对于的房间;否则,程序给一个警告;目标是从开始的房间走到目标房间。

这个程序是一个典型的状态机,状态就是当前的房间,每个房间写一个函数。用尾调用来从一个房间移动到另一个房间。如果不用尾调用的话,每一次移动都要将堆栈升级一个level,一定数量的移动后,可能就会导致程序溢出了。使用尾调用的话,就不需要担心这个问题了。废话少说,下面是代码,已经验证过了,比较简单。

function room1 ()    local move = io.read()    if move == "south" then return room3()    elseif move == "east" then return room2()    else        print("invalid move")        return room1() -- stay in the same room    endendfunction room2 ()    local move = io.read()    if move == "south" then return room4()    elseif move == "west" then return room1()    else        print("invalid move")        return room2()    endendfunction room3 ()    local move = io.read()    if move == "north" then return room1()    elseif move == "east" then return room4()    else        print("invalid move")        return room3()    endendfunction room4 ()    print("congratulations!")end--写完上面的四个room,调用一下就可以了。room1()


水平有限,如果有朋友发现错误,欢迎留言交流。


热点排行