Lua程序设计笔记一: 基础用法/类型与值

来源:互联网 发布:java反编译怎么用 编辑:程序博客网 时间:2024/05/16 18:51

最近公司要做游戏,就把我拉壮丁上了前线,没有办法,人手不足,要使用C++/Lua去做一些事情,项目又赶的很紧,很郁闷。。。在出来完app那边的开发工作之后,我就开始吃用cocos2d-x来做游戏了,-x框架使用起来的确非常方便,很容易就上手了,慢慢地觉得C++其实使用起来很方便,比起C来说的确是要爽很多,也非常强大。于是花了几天业余时间把lua过了一遍,又学习了一下C++的基本语法,跟大学时候学习C++完全是两种感觉,那时是知道面向对象,但是如何去使用,却根本没有思路,这次快多了,而且知道如何使用封装了,于是开始上手写游戏了,boss可真是对我很信任。。。。。

但是关于lua的使用方面,我却是一头雾水,可能由于lua都是在公交上看的,具体实践不是很多,当时碰见比较难的点,也都pass掉了。现在想想的确是有必要去回头看一下lua的基本,然后再去研究一下cocos2d-x如何绑定lua的,这个无论对于项目马上要使用lua的部分而言,还是提升自己的框架设计封装能力,都是很不错的。之前看的时候,纸写的笔记,很不方便,没法搜索归档,写完之后也就丢失了。这次决定,把学习过程还有所有的实例分析,写到blog中来。刚开始的时候,找了一些lua教程,但是很初级很泛泛,没有真的深入去理解学习就开始使用了,而且绑定工程工作原理,也之后<lua程序设计>这本书能讲的明白。

先做一下笔记,把之前看书的时候觉得重要的地方摘抄下来,这种最笨的方法我觉得对我来说是最有效的

===============================================

一. 基础用法

1. 单行注释: 两个连字符(--)开始一个“行注释”

2. 块注释: 以"--[["开始,直至"]]"结束;这里有个常见的技巧,注释一段代码时,将代码放入"--[["和"--]]"中间,这样重新启用某段代码时,只需要改为"---[["即可,这样就是以三个连字符开始,表示后面的是行注释

3. 全局变量: 在lua中,使用全局变量不需要声明,只需要将一个值赋予一个全局变量即可。lua中,访问一个未初始化的变量的时候不会引发错误,访问结果是一个特殊的值"nil";删除一个全局变量,将某个值赋为nil即可。

4. 在使用lua脚本文件的时候,可以设置类型来确定解释器的位置,这样就可以直接运行这个文件,会选择相应的解释器来运行这个脚本文件:

#!/usr/local/bin/lua 或者 #!/usr/bin/env lua

5. lua解释器的用法: lua [选项参数] [脚本[参数]]

“-e”表示可以直接在命令行中输入代码;"-l"用于加载库文件;"-i"表示运行命令行后进入交互模式

6. lua脚本中,会通过全局变量 "arg"来检索脚本的启动参数


二. 类型与值

1. lua中有8中基础类型: nil, boolean, number, string, userdata(自定义类型), function,thread,table

2. 变量没有预定义的类型,任何变量都可以包含任何类型的值,也就是说可以先赋给一个类型的值,然后再赋给其他类型的值。

3. 内置的函数type可以根据一个值返回其类型名称, 如 type("Hello") --> string;对于未初始化的,则返回nil

4. lua中,函数是作为"第一类值(first-class value)"来看待的,可以像操作其他值一样来操作一个函数值

5 boolean: false和true类型,lua中将false和nil视为"假",其他值都视为"真"

6. number: 表示实数,lua中没有整数类型

7. string: 

(1). Lua中的一个字符串通常表示"一个字符序列"。lua完全采用8位编码,lua字符串中的字符可以具有任何数值编码,包括数值0,也就是说,可以将任意二进制数据存储到一个字符串中。Lua的字符串是一个不可变的值(immutable values),只能根据修改要求来创建一个新的字符串。

(2). Lua的字符串和其他lua对象(例如table或函数等)一样,都是自动内存管理机制所管理的对象。这表示无需担心字符串的分配和释放问题。

(3). 字符串可以包含C语言风格的转义字符串。Lua中的字符串,还可以通过数值来指定字符串中的字符,数值以转义序列"\<ddd>"给出,其中<ddd>是一个之多三个十进制数字组成的序列。

(4). 可以通过一对匹配的双方括号来界定一个字母字符串,就像"块注释"那样。以这种形式书写的字符串可以延伸多行,lua不会解释其中的转义序列。此外,如果字符串的第一个字符是换行字符,那么lua会忽略它。对于包含有程序代码的字符串尤其有用。有时多行字符串中可能包含有"]]",这是可以在两个左方括号之间加上任意数量的等号,比如"[===[",这样字面字符串只有在遇到内嵌有相同数量等号的双右方括号时才会结束。上面的机制同样可以用在多行注释中

(5). 在Lua中,".."是字符串连接操作符。当直接在一个数字后面输入它的时候,必须要用一个空格来分割他们。不然,Lua会将第一个点理解为一个小数点

(6). lua提供了运行时的数字与字符串的自动转换,不仅在算术操作中会施以这种转换,还会在其他任何需要数字的地方这么做。tonumber函数,将一个string转换为number;tostring将一个number转换为string。

(7). Lua5.1中,在字符串前面放置"#"操作符来获取字符串的长度


8.table:

(1) table类型实现了"关联数组(associative array)",是一种具有特殊索引方式的数组,不尽可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了nil)来索引它。此外,table没有固定大小,可以动态添加任意数量的元素到table中。可以说,table是Lua中主要的(事实上也是仅有的)数据结构机制。Lua也是通过table来表示模块(module),包(package)和对象(object)的。

(2). 在Lua中,table既不是“值”也不是“变量”,而是“对象”。没有办法通过声明来创建table,而是通过"构造表达式(constructor expression)"完成的。table永远是"匿名的(anonymous)",一个持有table的变量与table自身之间没有固定的关联性,当一个程序再也没有对一个table的引用时,Lua的垃圾收集器(garbage collector)最终会删除该table,并复用它的内存。

(3). 为了表示table中的一条记录,可以用字段名称作为索引,有几种表示方式:a["name"]或者a.name ;这里需要有个易错点,a.x和a[x]的问题,注意应该是a["x"]! 如果需要表示一个传统的数组或者线性表,只需要以整数作为key来使用table即可。

(4). 在Lua5.1中,长度操作符"#"用于返回一个数组或者线性表的最后一个索引值(或者为其大小)。在这里,对table的大小问题,请记住对于所有未初始化的元素的索引结果都是nil,lua将nil作为界定数组结尾的标志,当一个数组有"空隙(Hole)"时,即中间含有nil时,长度操作符会认为这些nil元素就是结尾标记。如果真的需要操作那些含有“空隙”的数组,可以使用函数table.maxn,它将返回一个table的最大正索引数。


9. function: 在Lua中,函数是作为“第一类值”来看待的,这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。


10. userdata(自定义类型): 由userdata类型可以将任意的C语言数据存储到Lua变量中,在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试,userdata用于表示一种由应用程序或者C语言库所创建的新类型。


原创粉丝点击