博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua入门教程
阅读量:5993 次
发布时间:2019-06-20

本文共 3639 字,大约阅读时间需要 12 分钟。

什么是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 Lanou"
)

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》这本书。

本文转自jiahuafu博客园博客,原文链接:http://www.cnblogs.com/jiahuafu/p/8289668.html,如需转载请自行联系原作者

你可能感兴趣的文章
SQL Server Browser 与动态端口
查看>>
Exchange Server2010系列之三:Exchange Server部署完成后的配置
查看>>
Cisco/H3C交换机配置与管理完全手册(第2版)卓越网正式到货
查看>>
让VMware ESX中的虚拟机随esx开机自动启动
查看>>
rhel6.5解决包的依赖的一个处理方法
查看>>
小功能隐藏着大学问---windows的ACL带来的挑战
查看>>
RSA2012系列(4):网络战揭秘
查看>>
Puppet扩展篇6-通过横向扩展puppetmaster增加架构的灵活性
查看>>
西安OpenParty11月29日活动高清图文回顾——新增西安APEC蓝美图!
查看>>
SFB 项目经验-16-呼叫前客户端性能测试
查看>>
Hyper-V 3.0部署PART 12:配置iSCSI存储
查看>>
我是如何帮助创业公司改进企业工作的
查看>>
微信公众平台小程序开放公测
查看>>
电商节后巨头们无法言说的“秘密”
查看>>
Facebook收购Moves进军可穿戴
查看>>
Dell:优化IT从定制化开始
查看>>
云计算一体机有妙用
查看>>
大数据产品不仅仅是IT工具
查看>>
在Windows Server 2008系统环境下无损调整分区
查看>>
全文目录
查看>>