lua学习之旅1

为啥现在这么多游戏是用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值