Lua 对于国人来说可能还比较陌生,然而随着它在电子娱乐、网络娱乐界得到大量的应用,许多人也开始关注起它来。
夸张的事情在 Lua 中可不止这一件,关键的关键是,Lua 实现它们都不费吹灰之力,也不用艰深的语法,这才是所有夸张中最夸张的。那么,如果你也开始觉察到 Lua 的不普通的话,就请随我一同走进 Lua 的世界。
新手提示:可以下载最新的 LuaEdit 这个程序,来编辑和运行 Lua 脚本。你可以很容易的从网上找到并下载它,3.0或以上版本就足够运行下面的示例了。打开 LuaEdit,File-New Unit,输入或粘贴代码,按“播放”键即可。
Lua 之简
Lua 给我们的东西,或者说需要我们记住的东西,只有变量、关键字和基本语法。而关键字和语法又与常见语言几乎一样,像if...then...elseif...else...end, while...do, for...in, function, repeat(循环次数控制), return; 像 +、-、*、/、^ 之类的标准数学符号 -- 这些对于编程有点基础的人来说,都几乎免学习。所谓“变量”的东西除了能装单个的数、字符串、表(table)、函数(function)以外,就是所谓的自定义数据(userdata)了,这个 userdata 理论上可以放任何东西,但如果 Lua 没有一个宿主的话,它似乎也不会被用到,所以无视它。
总之,Lua 给我们的一切,用一页纸几乎可以全部写出来(参见 Lua 5.1 白皮书索引前一页),而标准库则更是简到了“精致”的地步(可以参见本 Blog 的 Lua 基础篇转载)。
超出这一页,那么请发挥自己的想象力吧!
函数语法糖
在 Lua 编程者看来,Lua 的函数就是一种特殊的变量,用
function 声明它,用 () 紧跟在变量名后来使用它,像这样:
- f = function(x,y)
- return x + y
- end
- print(f(1,1))-- 注释:print 全局函数用于在控制台打印文字,此处输出 “2”
- function f(x,y)
- return x + y
- end
- print(f(1,1)) -- 输出“2”
嵌套函数
- function f(x,y)
- function f1(x)
- return x = x + 1
- end
- return f1(x)+y
- end
- print(1,1) -- 显示"3"
多返回值函数和无限形参
如果说这有些让你不太舒适,那么函数的如下功能,应当会让你略感顺心如意,请看多返回值函数:
- function f(x)
- return x, x+1, x+2
- end
- y,y1,y2=f(1)
- print(y,y1,y2) -- 打印“1 2 3”
要接收3个参数啊,麻烦,我只想接收一个:那么不接收就行了:
- function f(x)
- return x, x+1, x+2
- end
- y = f(1)
- print(y) -- “1”
- function f(x)
- return x, x+1, x+2
- end
- _, y1 = f(1)
- print(y1) -- “2”
- function f(...)
- for _, x in ipairs(arg) do
- print(x)
- end
- end
- f(4,5,6)
- --打印出:
- --4
- --5
- --6
放在函数里的 OOP
下面,我们来挑战下函数的极限:想用函数来模拟面向对象编程(OOP) 吗? 这个 Lua 函数实现的“狼吃兔子”游戏:
- function CreateAnimal(species,food,hungry,speed,living) -- 初始化动物类函数,参数依次为 种类、食物、饥饿度、速度、存活标记
- local function getSpecies() return species end
- local function getHungry() return hungry end
- local function getSpeed() return speed end
- local function getFood() return food end
- local function getLiving() return living end
- local function setLiving(bLive) living = bLive end -- 设置为 false,表示该动物已死亡
- local function eat(otherAnimal) -- 如果觅食主体的食物就是客体的种类,并且主体饥饿度大于0,并且主体的奔跑速度大于客体,则吃下客体