[Lua]入门教程
什么是Lua
Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 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语言中的"//"。
1
2
|
--这里是一行注释 print( "Hello Lanou" ) |
多行注释
使用"--[["表示注释开始,使用"]]"表示注释结束。这种注释相当于C语言中的"/*"和"*/"。
1
2
3
|
--[[这里是第一行注释 这里是第二行注释]] pring( "Hello Panda" ) |
Lua里的变量
在默认情况下,Lua里认为所有的变量都是全局变量。假如需要定义局部变量,则在声明变量时需要使用local说明。
并且在赋值的时候,允许同时给多个变量进行赋值。
1
2
3
4
5
6
7
8
9
10
11
|
-- i是一个局部变量 local i = 1 -- name是一个全局变量 name = "Lewis" -- age,height都是局部变量 local age,height = 34 , 183 . 5 -- gender,company都是全局变量 gender,company = "男" , "蓝鸥" |
Lua里的运算符
算数运算符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
-- +(加法) print( 1 + 2 ) -- -(减法) print( 1 - 2 ) -- *(乘法) print( 1 * 2 ) -- /(除法) print( 1 / 2 ) -- ^(乘方) print( 1 ^ 2 ) |
比较运算符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-- <(小于) print( 1 < 2 ) -- >(大于) print( 1 > 2 ) -- <=(小于等于) print( 1 <= 2 ) -- >=(大于等于) print( 1 / 2 ) -- ==(等于等于) print( 1 == 2 ) -- ~=(不等于) print( 1 ~= 2 ) |
逻辑运算符
在使用逻辑运算符时与C语言差别很大。
在Lua语言里,只有false和nil才为false,其他任何数据都是true,0也是true!!!
and 和 or 的运算结果不是true和false,而是和他的两个操作数相关。
a and b:如果a为false,则返回a;否则,返回b;
a or b:如果a为true,则返回a;否则,返回b;
1
2
3
4
5
6
7
8
|
-- and (与) print( 1 and 2 ) -- or (或) print( 1 or 2 ) -- not (非) print( 1 not 2 ) |
通过Lua里的这种特性,可以模拟C语言中的 ?:运算符
例如:C语言中的 x=a?b : c,在Lua中,可以写成 x = a and b or c。
Lua里的数据类型
关键字 | 描述 |
nil | 空值,所有没有使用过的变量都是nil;nil既是值,又是数据类型 |
boolean | 布尔类型,只有两个有效的值:true和false |
number | 数值类型,在Lua里,相当于C语言里的double |
string | 字符串,如果愿意的话,字符串是可以包含"\0"字符的 |
table | 关系类型,这个类型的功能比较强大 |
function | 函数类型,可以由函数类型来声明变量 |
userdata | 这个类型专门与Lua的宿主打交道。宿主通常是由c语言和c++语言开发的,在这种情况下,userdata可以是宿主的任何类型,常用的是结构体和指针类型 |
thread | 线程类型,在Lua里没有真正的线程。 |
Lua里的代码块
在C语言中代码块是有"{"和"}"括起来的,在Lua中,使用do和end关键字括起来的。
1
2
3
|
do print( "Hello" ) end |
Lua里的关系类型
关系类型,是一个非常强大的类型。这个类型类似于C++语言里的映射结构,类似于PHP语言里的array对象,类似于OC里的NSDictionary对象。
在Lua里的关系类型(Table)定义很简单,它主要特征是使用"{"和"}"来括起来一系列的元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--声明一个关系类型的全局变量table table = {} --赋值关系变量table索引为 0 时的值是 34 table[ 0 ] = 34 --同时也可以写成 table.name = "Lewis" table[ "name" ] = "Lewis" table.gender = "男" --同样也可以将索引为 "son" 的对象写成另外一个表格 table[ "son" ] = {name = "DD" ,gender = "男" } --访问对象时就可以使用 print(table.son.name) |
同样也可以如下声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- 声明关系变量table table = { 10 ,--相当于[ 1 ] = 10 [ 100 ] = 40 , lewis = { -- 同样也可以写成 [ "lewis" ] = age = 34 , -- 同样可以写成 [ "age" ] = 34 gender = "male" , }, 20 , --相当于[ 2 ] = 20 } print(table[ 2 ]) |
Lua里的函数
在Lua中,函数的定义非常简单。不过要注意的一点就是,return语句一定要写在end之前。假如我们非要在函数中加一个return语句,那就应该写成
1
2
3
4
|
do -- return 语句一定要在一个代码块结束前 return end |
函数举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
-- 声明函数类型变量sum function sum( v1,v2 ) -- 函数体 return v1 + v2 end -- 同样函数变量也可以如下声明 mul = function (v1,v2 ) -- 函数体 return v1 * v2 end --调用第一个函数sum print(sum( 2 , 3 )) --调用第二个函数mul print(mul( 3 , 4 )) |
Lua里的类
前边曾经说过,表类型可以拥有任意类型的值,包括函数!
因此,我们就可以创建一个具有函数变量的表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
lewis = { age = 34 , work = function ( self ,message) -- 函数体 self .age = self .age + 1 ; print( self .age .. message) end } print(lewis.age) lewis.work(lewis, "上班" ) --也可以如下调用方法 lewis :work ( "上班" ) |
结束
就像C语言一样,Lua里提供了很多的标准函数库来增强语言的功能。使用这些函数,可以很方便的操作各种数据类型。
可以参考《Programming in Lua》这本书。
[Lua]入门教程的更多相关文章
- [Lua]Lua入门教程
什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...
- Lua入门教程
什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...
- Openresty最佳案例 | 第2篇:Lua入门
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准 ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 【原】Redis入门教程
最近在学习Redis,写几篇文章记录一下学习过程:Redis入门教程. 1.Redis基本概念 Redis Redis Keys Redis 基本数据类型 Redis基本操作 遍历操作 Pub-Sub ...
- 转:几十种编程语言的快速入门教程- learnxinyminutes.com
原文来自于:http://top.jobbole.com/15551/ 这家网站的名称是 Learn X in Y minutes,包括了几十种编程语言的快速学习入门教程.打开几种编程语言来看了一下, ...
- [置顶] 轻量级语言Lua入门
作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...
- 超强、超详细Redis数据库入门教程(转载)
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
随机推荐
- Javascript performance
I just went through some vedio related to javascript performance which is great, Here is the notes I ...
- 路由器扫描的Java源码
这个源码不是本人写的,是我原来的领导写的,我们都叫他东哥,这个是东留给我的一个小资源,好佩服他哦,这个东西可以用来扫描全世界的路由器,破解路由器账户和密码 当然是简单的了.我能力不够没有更完善的补充下 ...
- Python 脚本生成测试数据,Python生成随机数据,Python生成大量数据保存到文件夹中
代码如下: import random import datetime import time dataCount = 10*100*100 #10M. codeRange = range(ord(' ...
- echo "hello" | nc -4t -w1 localhost 8001
TCP4: echo "hello" | nc -4t -w1 localhost 8001 UDP4: echo "hello" | nc -4u -w1 l ...
- 【Todo】各种排序整理
今天面试别人,问到堆排序.发现自己都记不太清楚了. 堆排序 从小到大排序,要用到的是,最大堆. 过程是最大堆,堆顶的最大的元素,调换到数组最后,依次进行.最后达到从小到大的效果. 归并排序 可以看这个 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- 反编译android APK
我们经常会在如下的情况使用反编译 1.看到别人应用中的酷炫功能,想知道是如何实现的 2.别人应用的素材排版好漂亮,想套用模仿 百度一下就已经有一大堆反编译的教程了,我还是坚持学习记录一下. A ...
- bzoj4026
直接按照欧拉函数的计算方式来即可 φ=区间积*区间出现(质数-1)的积/区间出现过的质数的积 区间积是满足类似区间减法的操作的(利用逆元) 由于强制在线,上主席树就可以了(维护每个质数上次出现的位置p ...
- UVa 11624 (BFS) Fire!
也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...
- Object-C 内存管理及对象
关于OC 的内存管理是使用 引用计数的方式 进行管理的引用计数可以使用 办公室的开关灯 来说明 如下图与 OC对象 对应如下