为啥现在这么多游戏是用lua呢。。到底lua好处都有啥(吸收地下氮磷钾,小麦亩产一千八)。。
1.粘合剂语言,可用来调用c++之类的。
2.小巧,动态类型(说的就是table吧),自动内存管理(这个还没涉及过)。
其实没特别的感觉,只看了几章书。
简单总结一下lua的一些语法,主要是平时用c++的对比一下
一,数据类型方面以及表达式上
1. 没有强的数据类型,声明变量默认是全局的,要局部的请加local吧。
声明一个变量 n = 123; 直接可以将其赋值为其他数据类型 如 n = ‘123’
2.只有nil 跟 false表示false。 0也表示为true
3.~=的含义同 != 不等于嘛,用and 和 or 表示与或
4. .. 可以用来连接,连接两个输出或者两个字符
5. c中的a ? b : c ,在lua中就是(a and b) or c
6.tables 如 b = {“123”,"234","345"} 默认的索引是从1开始的
7.赋值语句可以多个进行赋值 a,b = 2,3 右边多了就被忽略,左边多了就会自动赋值为nil,交换两个变量的值可以这么写 a,b = b, a 当然return 也可以这么写 reurn 1,2,3一次过返回多个值
8.循环语句为
while 条件 do
.....
end
或者为
repeat
...
until
9.条件语句为
if 条件 then
....
else if 条件 then
.....
end
10. for语句有两种模式
一是 for i = 2,10,1 do ... end 就是初始为2,每次增加1,循环到i等于10这样子,每次的step默认为1
二是就如 for i,v in ipairs(a) do print(v) end 每次循环从ipairs取得返回值,直到第一个返回值,也就是i 为nil的时候循环结束
11. Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前)
二 函数 闭包
lua的函数可以当作一个变量那样处理,例如
function f ..... end 完全可以写作 f = function ..... end
还可以作为table其中的值
函数的操作的形参跟实参还是多忽少补的原则就如 f(a,b,c),可以这么调用 f(1,2) 或者 f(1,2,3,4),前者c = nil 后者 4将会被忽略
当然返回值也是可以return 多个,当然也可以强制只有一个例如 print((f(1,2,3)));
跟着就是闭包特性了,在函数的声明匿名函数然后里面的值每次操作的结果都会保留。
function newCounter()
locali = 0
return function() -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
i就是其中的upvalues,闭包的upvalues感觉就是C++的类的一些成员对象,里面的匿名函数就好像成员函数,匿名函数就是operator()重载成员函数。声明了一个函数类型的变量就好像声明了一个变量那样。
三 编译。运行。调试
主要介绍了一些函数的用法吧
dofile("a.lua") 加载而且运行,再次运行时要重新加载
loadfile("a.lua")只加载不运行,加载一次后可多次运行
loadstring("i = i + 1") 相当于直接运行 i = i +1
require 是加载文件如加载ilil.lua 直接 调用 require("ilil") 路径如下 ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
error("invalid input") 直接抛出 invaild input的错误信息
assert(io.read("*number"), "invalid input") 如果前面的语句为false 就会抛出错误
四 协同程序
co = coroutine.create(function()
print("hi")
end)
coroutine.create创造一个协同程序,一般用一个匿名函数作为参数
coroutine.status(co) 返回这协同程序的状态
coroutine.resume(co) 唤醒协同程序当然可以附上参数coroutine.resume(co,1,2)
coroutine.yield(co)挂起程序,也可以跟resume一样附上参数
resume跟yield会有一个通讯机制。 如果初次调用resume,那么resume的参数就会直接赋予匿名函数
调用yield的时候会中断在函数调用yield的地方,yield的参数将作为resume的返回值。而这个时候yield是还没有返回(如果函数已经执行完,那么重新挂起然后唤醒也没有结果,因为已经该函数执行完了)
在次调用resume的时候,那么resume的参数作为yield的返回值,这时候yield返回,继续执行yield后面的代码。
参考代码如下
function foo (a)
print("foo", a) -- foo 2
return coroutine.yield(2 * a) -- return: a , b
end
co = coroutine.create(function (a , b)
print("co-body", a, b) -- co-body 1 10
local r = foo(a + 1)
print("co-body2", r)
local r, s = coroutine.yield(a + b, a - b)
print("co-body3", r, s)
return b, "end"
end)
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("------")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("------")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("------")
print("main", coroutine.resume(co, "x", "y")) -- false cannot resume dead coroutine
print("------")
结果如下
>lua -e "io.stdout:setvbuf 'no'" "cur.lua"
co-body 1 10
foo 2
main true 4
------
co-body2 r
main true 11 -9
------
co-body3 x y
main true 10 end
------
main false cannot resume dead coroutine
------
>Exit code: 0
该代码转自http://www.cnblogs.com/yjf512/archive/2012/05/28/2521412.html