LUA简明教程
- 格式:pdf
- 大小:353.20 KB
- 文档页数:11
赢在路上创客学院赢在路上[Cocos2dx]Lua基础入门教程什么是LuaLua 是一个小巧的脚本语言。
是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、WaldemarCeles 和Luiz Henrique de Figueiredo所组成并于1993年开发。
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。
Lua并没有提供强大的库,这是由它的定位决定的。
所以Lua 不适合作为开发独立应用程序的语言。
Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。
Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。
Lua 由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。
这一切都决定了Lua是作为嵌入式脚本的最佳选择Lua里的注释单行注释使用两个减号表示注释的开始,一直延续到行末位置。
相当于C语言中的"//"。
多行注释使用"--[["表示注释开始,使用"]]"表示注释结束。
这种注释相当于C语言中的"/*"和"*/"。
Lua里的运算符算数运算符比较运算符逻辑运算符 在使用逻辑运算符时与C 语言差别很大。
在Lua 语言里,只有false 和nil 才为false ,其他任何数据都是true ,0也是true !!!and 和 or 的运算结果不是true 和false ,而是和他的两个操作数相关。
Lua极简⼊门指南(⼀):基础知识篇本⽂是《Programming in Lua 3rd》读书笔记。
Chunks⼀个 Chunk 就是⼀组被执⾏的语句,例如⼀个⽂件或者交互模式下的⼀⾏。
标识符(identifiers)我们应该避免使⽤以 _ 开头并跟上⼀个或者多个⼤写字母的字符串来作标识符,它们被保留作特殊的⽤途(例如:_VERSION)。
注释单⾏注释使⽤复制代码代码如下:--多⾏注释使⽤复制代码代码如下:--[[ 和 --]]类型简介Lua 存在的数据类型包括:1.nil。
此类型只有⼀个值 nil。
⽤于表⽰“空”值。
全局变量默认为 nil,删除⼀个已经赋值的全局变量只需要将其赋值为 nil(对⽐ JavaScript,赋值 null 并不能完全删除对象的属性,属性还存在,值为 null)2.boolean。
此类型有两个值 true 和 false。
在 Lua 中,false 和 nil 都表⽰条件假,其他值都表⽰条件真(区别于 C/C++ 等语⾔的是,0 是真)3.number。
双精浮点数(IEEE 754 标准),Lua 没有整数类型4.string。
你可以保存任意的⼆进制数据到字符串中(包括 0)。
字符串中的字符是不可以改变的(需要改变时,你只能创建⼀个新的字符串)。
获取字符串的长度,可以使⽤ # 操作符(长度操作符)。
例如:print(#”hello”)。
字符串可以使⽤单引号,也可以使⽤双引号包裹,对于多⾏的字符串还可以使⽤ [[ 和 ]] 包裹。
字符串中可以使⽤转义字符,例如 \n \r 等。
使⽤ [[ 和 ]]包裹的字符串中的转义字符不会被转义erdata。
⽤于保存任意的 C 数据。
userdata 只能⽀持赋值操作和⽐较测试6.function。
函数是第⼀类值(first-class value),我们能够像使⽤其他变量⼀样的使⽤函数(函数能够保存在变量中,可以作为参数传递给函数)7.thread。
Lua教程(七):数据结构详解Lua中的table不是⼀种简单的数据结构,它可以作为其它数据结构的基础。
如数组、记录、线性表、队列和集合等,在Lua中都可以通过table来表⽰。
1. 数组:使⽤整数来索引table即可在Lua中实现数组。
因此,Lua中的数组没有固定的⼤⼩,如:复制代码代码如下:a = {}for i = 1, 1000 doa[i] = 0endprint("The length of array 'a' is " .. #a)--The length of array 'a' is 1000在Lua中,可以让任何数作为数组的起始索引,但通常⽽⾔,都会使⽤1作为其起始索引值。
⽽且很多Lua的内置功能和函数都依赖这⼀特征,因此在没有充分理由的前提下,尽量保证这⼀规则。
下⾯的⽅法是通过table的构造器来创建并初始化⼀个数组的,如:复制代码代码如下:squares = {1, 4, 9, 16, 25}2. ⼆维数组:在Lua中我们可以通过两种⽅式来利⽤table构造多维数组。
其中,第⼀种⽅式通过“数组的数组”的⽅式来实现多维数组的,即在⼀维数组上的每个元素也同样为table对象,如:复制代码代码如下:mt = {}for i = 1, N domt[i] = {}for j = 1, M domt[i][j] = i * jendend第⼆种⽅式是将⼆维数组的索引展开,并以固定的常量作为第⼆维度的步长,如:复制代码代码如下:mt = {}for i = 1, N dofor j = 1, M domt[(i - 1) * M + j] = i * jendend3. 链表:由于table是动态的实体,所以在Lua中实现链表是很⽅便的。
其中,每个结点均以table来表⽰,⼀个“链接”只是结点中的⼀个字段,该字段包含对其它table的引⽤,如:复制代码代码如下:list = nilfor i = 1, 10 dolist = { next = list, value = i}local l = listwhile l doprint(l.value)l = l.nextend4. 队列与双向队列:在Lua中实现队列的简单⽅法是使⽤table库函数insert和remove。
Lua语⾔新⼿简单⼊门教程⼀、前⾔Lua 是⼀种轻量⼩巧的脚本语⾔,⽤标准 C 语⾔编写并以源代码形式开放,其设计⽬的是为了嵌⼊应⽤程序中,从⽽为应⽤程序提供灵活的扩展和定制功能。
Lua 可以应⽤在游戏开发、独⽴应⽤脚本、Web 应⽤脚本、扩展和数据库插件、安全系统等场景。
笔者学习的⽬的主要是为了能在 Web 应⽤(Nginx、Redis)中使⽤到 Lua 脚本。
特点Lua脚本可以很容易的被C/C++ 代码调⽤,也可以反过来调⽤C/C++的函数。
Lua由标准C编写⽽成,代码简洁优美,⼏乎在所有操作系统和平台上都可以编译,运⾏。
以极⼩的体积和简单的语法提供全⾯的功能。
[⼀个完整的Lua解释器不过200k,在⽬前所有脚本引擎中,Lua的速度是最快的]实现与宿主语⾔的简洁接⼝成为⼀个很容易嵌⼊其它语⾔中使⽤的语⾔。
特性⽀持⾯向对象编程轻量级可扩展函数式编程⾃动内存管理通⽤类型的表–table,可实现数组,哈希表,集合,对象⽀持闭包⽀持多线程⽀持交互式编程⼆、安装注意:请确保安装 Lua 之前系统已安装 readline 和 readline-devel。
如果没有则键⼊yum install -y readline readline-devel 进⾏安装。
curl -R -O /ftp/lua-5.3.4.tar.gztar zxf lua-5.3.4.tar.gzcd lua-5.3.4make linux test测试,命令⾏中键⼊ lua -v:Lua 5.1.4 Copyright (C) 1994-2008 , PUC-Rio显⽰ Lua 版本说明安装正确。
三、运⾏⽅式与其他脚本语⾔⼀样,我们需要将 Lua 代码编写在⽂件中,后缀名为 .lua。
运⾏该⽂件的代码时,只需在命令⾏键⼊ lua xx.lua 即可。
四、语法4.1 数据类型Lua 中包含 8 种基本数据类型,即:nil、boolean、number、string、userdata、function、thread 和 table。
Lua 简明教程
2013-12-313:45|发布者:红黑魂|查看:2591|评论:0|原作者:陈皓|来自:酷壳网
摘要:这几天系统地学习了一下Lua 这个脚本语言,Lua 脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark 的脚本,当你把他的源码下下来编译后,你会发现解释器居...
这几天系统地学习了一下Lua 这个脚本语言,Lua 脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx ,wireshark 的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k ,这是多么地变态啊(/bin/sh 都要1M ,MacOS 平台),而且能和C 语言非常好的互动。
我很好奇得浏览了一下Lua 解释器的源码,这可能是我看过最干净的C 的源码了。
我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文章会挫败人的学习热情,我始终觉得好的文章读起来就像拉大便一样,能一口气很流畅地搞完,才会让人爽(这也是我为什么不想写书的原因)。
所以,这必然又是一篇“入厕文章”
,还是那句话,我希望本文能够让大家利用上下班,上厕所大便的时间学习一个技术。
呵呵。
相信你现在已经在厕所里脱掉裤子露出屁股已经准备好大便了,那就让我们畅快地排泄吧……
运行
首先,我们需要知道,Lua 是类C 的,所以,他是大小写字符敏感的。
下面是Lua 的Hello World 。
注意:Lua 脚本的语句的分号是可选的,这个和GO 语言很类似。
你可以像python 一样,在命令行上运行lua 命令后进入lua 的shell 中执行语句。
也可以把脚本存成一个文件,用如下命令行来运行。
或是像shell 一样运行:
6
语法
变量
Lua 的数字只有double 型,64bits ,你不必担心Lua 处理浮点数会慢(除非大于100,000,000,000,000),或是会有精度问题。
你可以以如下的方式表示数字,0x 开头的16进制和C 是很像的。
字符串你可以用单引号,也可以用双引号,还支持C 类型的转义,比如:‘\a’(响铃),‘\b’(退格),‘\f’(表单),‘\n’(换行),‘\r’(回车),‘\t’
(横向制表),‘\v’(纵向制表),‘\\’(反斜杠),‘\”‘(双引号),以及‘\”(单引号)
下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)
C 语言中的NULL 在Lua 中是nil ,比如你访问一个没有声明过的变量,就是nil ,比如下面的v 的值就是nil
布尔类型只有nil 和false 是false ,数字0啊,‘’空字符串(’\0′)都是true !
另外,需要注意的是:lua 中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。
变量前加local 关键字的是局部变量。
控制语句
不多说了,直接看代码吧(注意:Lua没有++或是+=这样的操作)
上面的语句不但展示了if-else语句,也展示了
1)“~=”是不等于,而不是!=
2)io库的分别从stdin和stdout读写的read和write函数
3)字符串的拼接操作符“..”
另外,条件表达式中的与或非为分是:and,or,not关键字。
for循环
从1加到100
从1到100的奇数和
从100到1的偶数和
函数
Lua的函数和Javascript的很像
闭包
同样,Javascript附体!
示例一
示例二
和Go语言一样,可以一条语句上赋多个值,如:
上面的代码中,因为只有3个变量,所以第四个值被丢弃。
函数也可以返回多个值:
注意:上面的示例中,因为没有传id ,所以函数中的id 输出为nil ,因为没有返回bGay ,所以bGay 也是nil 。
局部函数
函数前面加上local 就是局部函数,其实,Lua 中的函数和Javascript 中的一个德行。
比如:下面的两个函数是一样的:
Table
所谓Table 其实就是一个Key Value 的数据结构,它很像Javascript 中的Object
,或是PHP 中的数组,在别的语言里叫Dict 或Map ,Table 长成这个样子:
下面是table 的CRUD 操作:
上面看上去像C/C++中的结构体,但是name,age,handsome,website 都是key 。
你还可以像下面这样写义Table :
这样就更像Key Value 了。
于是你可以这样访问:t[20],t["name"],t[3.14]。
我们再来看看数组:
这样看上去就像数组了。
但其实其等价于:
所以,你也可以定义成不同的类型的数组,比如:
注:其中的函数可以这样调用:arr[4]()。
我们可以看到Lua 的下标不是从0开始的,是从1开始的。
注:上面的程序中:#arr 的意思就是arr 的长度。
注:前面说过,Lua 中的变量,如果没有local 关键字,全都是全局变量,Lua 也是用Table 来管理全局变量的,Lua 把这些全局变量放在了一个叫“_G”的Table 里。
我们可以用如下的方式来访问一个全局变量(假设我们这个全局变量名叫globalVar ):
我们可以通过下面的方式来遍历一个Table 。
MetaTable 和MetaMethod
MetaTable 和MetaMethod 是Lua 中的重要的语法,MetaTable
主要是用来做一些类似于C++重载操作符式的功能。
比如,我们有两个分数:
我们想实现分数间的相加:2/3+4/7,我们如果要执行:fraction_a +fraction_b ,会报错的。
所以,我们可以动用MetaTable ,如下所示:
为之前定义的两个table 设置MetaTable :(其中的setmetatble 是库函数)
于是你就可以这样干了:(调用的是fraction_op.__add()函数)
至于__add 这是MetaMethod ,这是Lua 内建约定的,其它的还有如下的MetaMethod :
“面向对象”上面我们看到有__index
这个重载,这个东西主要是重载了find key 的操作。
这操作可以让Lua 变得有点面向对象的感觉,让其有点像Javascript 的prototype 。
(关于Javascrip 的面向对象,你可以参看我之前写的Javascript 的面向对象)
所谓__index ,说得明确一点,如果我们有两个对象a 和b ,我们想让b 作为a 的prototype 只需要:
例如下面的示例:你可以用一个Window_Prototype 的模板加上__index 的MetaMethod 来创建另一个实例:
于是:MyWin 中就可以访问x,y,width,height 的东东了。
有了以上的基础,我们可以来说说所谓的Lua 的面向对象。
上面我们可以看到有一个new方法和一个toString的方法。
其中:
1)self就是Person,Person:new(p),相当于Person.new(self,p)
2)new方法的self.__index=self的意图是怕self被扩展后改写,所以,让其保持原样
3)setmetatable这个函数返回的是第一个参数的值。
于是:我们可以这样调用:
继承如下,我就不多说了,Lua和Javascript很相似,都是在Prototype的实例上改过来改过去的。
11
模块
我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua。
载入的时候就直接执行那个文件了。
比如:
我们有一个hello.lua的文件:
如果我们:require(“hello”),那么就直接输出Hello,World!了。
注意:
1)require函数,载入同样的lua文件时,只有第一次的时候会去执行,后面的相同的都不执行了。
2)如果你要让每一次文件都会执行的话,你可以使用dofile(“hello”)函数
3)如果你要玩载入后不执行,等你需要的时候执行时,你可以使用loadfile()函数,如下所示:
loadfile(“hello”)后,文件并不执行,我们把文件赋给一个变量hello,当hello()时,才真的执行。
(我们多希望JavaScript也有这样的功能(参看《Javascript装载和执行》))
当然,更为标准的玩法如下所示。
假设我们有一个文件叫mymod.lua,内容如下:
文件名:mymod.lua
于是我们可以这样使用:
其实,require干的事就如下:(所以你知道为什么我们的模块文件要写成那样了)
参考
我估计你差不多到擦屁股的时间了,所以,如果你还比较喜欢Lua的话,下面是几个在线文章你可以继续学习之: lua在线手册
lua在线lua学习教程
lua参考手册Lua参考手册的中文翻译(云风翻译版本)
关于Lua的标库,你可以看看官方文档:string,table,math,io,os。
(全文完)。