Lua快速教程

前言

 

  Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 所组成并于 1993 年开发。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua 由标准 C 编写而成,几乎在所有操作系统和平台上都可以编译、运行。Lua 并没有提供强大的库,这是由它的定位决定的。所以 Lua 不适合作为开发独立应用程序的语言。

 

  Lua 脚本可以很容易的被 C/C++ 代码调用,也可以反过来调用 C/C++ 的函数,这使得 Lua 在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替 XML、ini 等文件格式,并且更容易理解和维护。本文涉及到的演示均在Linux下进行

 

Lua退出

不先讲运行,直接讲退出。没错,因为运行Lua太简单了,简单到直接输入lua就可以了。但是退出确有必要单独说下,很多人在lua交互界面会试着使用exit退出,结果发现然并卵,与似乎干脆Ctrl + C干死lua。正确的推出姿势是这样婶的,有两种方式

①Ctrl+D

②os.exit()

Lua执行

在lua交互式环境下,你可以输入一些较短的命令,类似于Python。但是要想处理复杂逻辑,就需要单独放在文件中了。lua交互模式下如何执行一个文件?这个也很简单lua xxx.lua,和Python用法一样。但是你如果非要在交互式环境下执行lua脚本呢?也可以,使用dofile函数

learn.lua脚本

function norm(x,y)
  return(x^2+y^2)^0.5
end 

function twice(x)
  return 2*x 
end
View Code

使用dofile函数加载lua脚本到交互模式下

[root@localhost learn]# lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> dofile("/root/learn/learn.lua")
> n=norm(3.4,1.0)
> print(n)
3.5440090293339
> print(twice(n))
7.0880180586677
> 
View Code

Lua语法

注释

--单行注释

--[[     --]]多行注释

类型与值

与C/C++不同,Lua是动态类型语言。Lua中变量没有类型,值才有类型,值本身携带自己的类型信息。Lua中有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和table(表)。函数type 可根据一个值返回其类型名称。

nil

就是C/C++中的NULL。

Lua中的变量,没有初值时,其值为nil。当变量赋值为nil时,相当于删除,相当于与一块内存断开联系。当一块内存不在于任何变量有联系的时候,Lua垃圾收集器会回收内存。

boolean

用法同C/C++一样,但是有点小细节要注意

false:false、nil

true:0、空串

number

Lua中number默认相当于C/C++中的双精度浮点数,Lua中没有整数类型。写法上,和C/C++一样,支持多种表示方式

4     0.4     4.57e-3     0.3e12     5e+20

string

Lua的字符串是不可变的值(immutable values)。不能像在C语言中那样直接修改字符串的某个字符,而是应该根据修改要求来创建一个新的字符串。如下所示:

a = "one string"
b = string.gsub(a,"one","another")
print(a)    -->one string
print(b)    -->another string
View Code

与许多动态语言类似,Lua也支持自动内存管理,很爽是不是!

关于string还有以下几点需要注意

①\number,即用ASCII表示字符

②支持引号内部嵌套引号

print("one 'two' \"string\"")    -->one 'two' "string" 

③支持[[  ]]形式字符串

比如可以定义变量

c_code = [[
lua_getglobal(L,"str");
string str = lua_tostring(L,-1);
cout<<"str = "<<str.c_str()<<endl;
]]

这种形式定义的变量有两个特点:

1、[[后的第一个换行符会忽略

2、忽略[[ ... ]]内部的转义序列

这种形式定义的变量有两个潜在问题:

1、[[ ... ]]内部如果包含 a=b[c[i]] 这样的语句,可能会提前结束字符串定义

2、[[ ... ]]包含多行注释的情况,--]]可能会提前结束字符串定义

Lua的解决方案和CMake中多行注释是一个套路,即采用这种对称的这种符号[===[,等号数量任意

④某些情况西,Lua会自动进行字符串⇆数字的强制转换

print("10"+1)      -->11    字符串⇛数字
print(10 .. 1)     -->101   数字⇛字符串,注意10后面有个空格,否则Lua会把第一个.算成小数点,而不是连接符..

强烈不建议这种代码,可读性非常差。而是应该显式进行 字符串⇆数字 转换

print(tostring(10)=="10")    -->true
print(tonumber("10")==10)    -->true

 ⑤#可以获取字符串长度

print(#"hello")  -->5

table

Lua中的模块(module)、包(package)和对象(object)都是通过table来组织的。

当输入io.read的时候:

站在人的角度理解   ▶  io模块中的read函数

站在Lua的角度理解 ▶  以字符串“read”作为key来索引table.io

 Lua中的table跟其他语言中的字典是一个东西,除了可以使用数字索引外(Lua中数字索引从1开始),可以用任何其他类型的值作为table索引。

a.x 等价于 a["x"]
a[x] 表示取完x的值后再索引

#可以计算一个string的长度,同样也可以计算一个table的长度,table计算长度的方式类似于C/C++中字符串求长度知道遇到\0,table遇到nil就认为table结束了。

a={}
a[1000]=1
print(#a)              --> 0
print(table.maxn(a))   --> 1000

这种table类似于Linux下面空洞文件的概念,table中1~999都是nil,也就是有洞。因此print(#a)输出0。如果真需要处理“有洞”的table,可以使用函数table.maxn返回一个table的最大正索引数。

操作符

算数操作符

+   -(减法)   *   /   %   ^   -(负号) 

与C/C++用法一样,单独说下%

Lua中 a%b 结果正负号与b相同

当x为实数时
x % 1             -->x的小树部分
x - x % 1         -->x的整数部分
x - x % 0.01      -->x精确到小数点后两位

关系操作符

<   >   <=   >=   ==   ~=

与C/C++用法一样。关系操作符所作的工作本质上是比较,比较分为值比较,引用比较。Lua中table、userdata、function属于引用比较

a = {};a.x = 1; a.y = 0
b = {};a.x = 1; a.y = 0
a = c
---------------------------------------
结果是
a == c
a ~= b

逻辑操作符

and   or   not

这是我第一个地方觉得Lua设计非人类的地方,主要原因是and   or的用法原大多数语言都不一样,想不明白Lua为啥要搞成这样

and:如果第一个操作数为假,就返回第一个操作数,否则返回第二个操作数。

or:   如果第一个操作数为真,就返回第一个操作数,否则返回第二个操作数。

字符串连接符

..

Lua中的字符串是不可变的值(immutable value)。连接操作符只会创建一个新字符串,而不会对其原操作数进行任何修改

此外在对数字使用..的时候,..需要与数字之间留有空格

print("10"+1)      -->11    字符串⇛数字
print(10 .. 1)     -->101   数字⇛字符串,注意10后面有个空格,否则Lua会把第一个.算成小数点,而不是连接符..

 

 

 

 

 

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/10159018.html

lua中文教程,原名:programming in lua 目录 版权声明..............i 译序..i 目录iii 第一篇语言.......1 第0章序言.......1 0.1 序言..........1 0.2 Lua的使用者................2 0.3 Lua的相关资源............3 0.4 本书的体例.................3 0.5 关于本书...3 0.6 感谢..........4 第1章起点.......5 1.1 Chunks.......5 1.2 全局变量...7 1.3 词法约定...7 1.4 命令行方式.................7 第2章类型和值9 2.1 Nil..............9 2.2 Booleans....9 2.3 Numbers...10 2.4 Strings......10 2.5 Functions.12 2.6 Userdata and Threads.12 第3章表达式..13 3.1 算术运算符...............13 3.2 关系运算符...............13 3.3 逻辑运算符...............13 3.4 连接运算符...............14 3.5 优先级.....15 3.6表的构造..15 第4章基本语法................18 4.1 赋值语句.18 4.2 局部变量与代码块(block)......19 4.3 控制结构语句...........20 Programming in Lua iv Copyright ® 2005, Translation Team, www.luachina.net 4.4 break和return语句......23 第5章函数......24 5.1 返回多个结果值.......25 5.2可变参数..27 5.3 命名参数.28 第6章再论函数................30 6.1 闭包........32 6.2 非全局函数...............34 6.3 正确的尾调用(Proper Tail Calls)...36 第7章迭代器与泛型for....40 7.1 迭代器与闭包...........40 7.2 范性for的语义...........42 7.3 无状态的迭代器.......43 7.4 多状态的迭代器.......44 7.5 真正的迭代器...........45 第8章编译·运行·调试47 8.1 require函数.................49 8.2 C Packages.................50 8.3 错误........51 8.4 异常和错误处理.......52 8.5 错误信息和回跟踪(Tracebacks)....53 第9章协同程序................56 9.1 协同的基础...............56 9.2 管道和过滤器...........58 9.3 用作迭代器的协同...61 9.4 非抢占式多线程.......63 第10章完整示例..............68 10.1 Lua作为数据描述语言使用........68 10.2 马尔可夫链算法.....71 第二篇 tables与objects........75 第11章数据结构..............76 11.1 数组......76 11.2 阵和多维数组.........77 11.3 链表......78 11.4 队列和双端队列.....78 11.5 集合和包.................80 11.6 字符串缓冲.............80 第12章数据文件与持久化..................84 12.1 序列化...86 Programming in Lua v Copyright ® 2005, Translation Team, www.luachina.net 第13章 Metatables and Metamethods...92 13.1 算术运算的Metamethods............92 13.2 关系运算的Metamethods............95 13.3 库定义的Metamethods................96 13.4 表相关的Metamethods................97 第14章环境..103 14.1 使用动态名字访问全局变量...103 14.2声明全局变量........104 14.3 非全局的环境.......106 第15章 Packages.............109 15.1 基本方法...............109 15.2 私有成员(Privacy)................111 15.3 包与文件................112 15.4 使用全局表............113 15.5 其他一些技巧(Other Facilities)...115 第16章面向对象程序设计.................118 16.1 类.........119 16.2 继承.....121 16.3 多重继承...............122 16.4 私有性(privacy)...................125 16.5 Single-Method的对象实现方法127 第17章 Weak表...............128 17.1 记忆函数...............130 17.2 关联对象属性.......131 17.3 重述带有默认值的表...............132 第三篇标准库134 第18章数学库................135 第19章 Table库...............136 19.1数组大小................136 19.2 插入/删除..............137 19.3 排序.....137 第20章 String库..............140 20.1 模式匹配函数.......141 20.2 模式.....143 20.3 捕获(Captures).146 20.4 转换的技巧(Tricks of the Trade)151 第21章 IO库..157 21.1 简单I/O模式..........157 21.2 完全I/O 模式........160 Programming in Lua vi Copyright ® 2005, Translation Team, www.luachina.net 第22章操作系统库........165 22.1 Date和Time............165 22.2 其它的系统调用...167 第23章 Debug库..............169 23.1 自省(Introspective)..............169 23.2 Hooks...173 23.3 Profiles.174 第四篇 C API..177 第24章 C API纵览..........178 24.1 第一个示例程序...179 24.2 堆栈.....181 24.3 C API的错误处理..186 第25章扩展你的程序....188 25.1 表操作.189 25.2 调用Lua函数.........193 25.3 通用的函数调用...195 第26章调用C函数..........198 26.1 C 函数..198 26.2 C 函数库................200 第27章撰写C函数的技巧..................203 27.1 数组操作...............203 27.2 字符串处理...........204 27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 28.4 访问数组...............219 28.5 Light Userdata........220 第29章资源管理............222 29.1 目录迭代器...........222 29.2 XML解析...............225
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值