认识lua
lua是一种轻量小巧的脚本语言,它用标准C语言编写并以源代码形式开放。标志Lua虚拟机可以很方便的嵌入别的程序中,从而为应用程序提供灵活的扩展功能。而整个Lua虚拟机编译后仅仅100余k,经过适当的裁剪可能做到更小,十分适合嵌入式的开发。
Lua的运行速度占有绝对优势,这些都决定了Lua作为嵌入式脚本的最佳选择。
输出
在Lua中,可以使用print函数打印出你想要的结果。使用函数名(参数)来执行。
print("liustu.com.cn-Lua")
代码注释
注释可是使用–用来注释一行;
使用–[[内容]]
--print("这段内容不被执行")
--[[print("这段内容不被执行")]]
变量
number变量
变量,变量可以赋予你想赋予的内容,但必须是Lua的合法类型。
nil
nil等同于NULL,标识没有声明的值。
赋值语句
赋值是改变一个变量的最常见的方式。a=b即将b的值赋值给a。
Lua可以对多个变量同时赋值,变量用逗号分开,赋值语句右边的值以此赋给左边的变量。
a,b = 1,2
当左右的数量不一致时,要求变量个数>值得个数,变量多余的会为nil;变量个数<值得个数,多余的值被忽略。
使用 a, b = b, a可是实现数据得交换。
算数运算符
Lua也存在运输算符,包括:
+ 加法
– 减法
* 乘法
/ 整除
% 取余
^ 幂乘
– 负号字符串
string类型变量
字符串用来存储你想要存储的文本信息。在Lua中字符串可以用三种方式表示:
1、单引号间的一串字符
2、双引号间的一串字符
3、[[和]]间的一串字符其实[[和]]的格式是保留出入的格式,下面为测试代码
--双引号间的一串字符 str1 = "Lua" --单引号间的一串字符 str2 = 'Lua' --[[和]]--间的一串字符 str3 = [[Lua]] str4 = [[使用双括号时,甚至能包含换行数据 换行了 最后一行]]
当你输出字符串的时候,print支持自主拼接字符串,例如
print("s1,s2,s3的值:",s1,s2,s3,"s1,s2,s3的值:",s1,s2,s3)
转义字符
Lua语言支持转义字符,和C语言相似。
转义字符 | 含义 |
---|---|
\n | 换行(LF),将当前位置移到下一行开头 |
\r | 回车(CR),将当前位置移到本行开头 |
\\ | 反斜杠字符 |
‘ | 单引号 |
“ | 双引号 |
\0 | 空字符(NULL) |
\ddd | 1到3位八进制数所代表的任意字符 |
\xhh | 1到2位十六进制所代表的任意字符 |
字符串拼接
除了上述可以使用print直接进行拼接字符串输出之外,也可以直接对字符串进行拼接赋值,使用的符号为“..”。如下示例:
all = s1 .. s2 .. s3
number转换string
可以把number类型的变量和string类型的变量拼接起来,组成一个新的string。使用tostring函数可是实现。
string转number
同样,可以将string转为number,字符串存储的内容可能是一个字符串,但是代表一个数字,就可以使用函数tonumber函数实现。
逻辑运算
布尔型和比较运算
布尔型只有两个类型:true和false;Lua中将nil看作为false,其他都是true,在lua中0也表示真。
Lua中也有多个关系运算符,用于判断数据之间的关系。其中不等符号(~=)与C语言的不等(!=) 存在差异。
符号 | 含义 |
---|---|
== | 等于,检测两个值是否相等,相等返回 true,否则返回 false |
~= | 不等于,检测两个值是否相等,相等返回 false,否则返回 true |
> | 大于,如果左边的值大于右边的值,返回 true,否则返回 false |
< | 小于,如果左边的值大于右边的值,返回 false,否则返回 true |
>= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false |
<= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false |
逻辑运算符
逻辑运算符基于布尔型的值来判断,并给出结果;在C语言中使用(&&、||、!),在Lua中使用(and、or、not)表示。
符号 | 含义 |
---|---|
and | 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B |
or | 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B |
not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false |
分支判断
条件判断
在Lua中,可以使用if语句来判断。下面是if语句的结构:
if 条件 then
--执行语句
end
当然Lua中可以使用if语句进行判断,同时可以使用else语句,表示多个分支判断
if 条件1 then
满足条件1
elseif 条件2 then
不满足条件1,但满足条件2
else
前面条件全都不满足
end
函数
Lua中也有函数的概念,在Lua中函数的调用类似python中,格式为:
function 函数名(参数1,参数2,参数3...)
--函数体
end
函数名()
在Lua中,函数也是一种变量类型,所有函数名实际上也是一个变量,里面存储的是一个函数,例如:
a = 函数名 --把hello函数同时赋值给a变量
a()
函数名()
--a和hello变量指向同一个函数
--所以执行结果和hello相同
因为函数只是一个变量,甚至可以直接声明一个变量为函数,例如:
a = funtion()
print("nihao")
end
a()
local变量
在C语言中,变量声明在函数内时默认为函数的局部变量,当函数结束时变量内存自动释放;而在Lua中默认为全局变量,我们需要使用local标识符创建一个临时变量。使用local创建的局部变量,作用域只在代码块内有效。
function fun()
loacl n = 2
print(n)
end
fun()
print(n)
--结果为fun函数内的输出为2,函数外的输出为nil
函数参数
函数参数等价于一个函数内部创建的local变量,类似于c语言中的实参与形参的概念。
函数返回值
函数定义时候没有声明返回值类型,我们在函数中使用return进行返回函数的返回值给调用它的函数。并且return允许返回一个值,也可以返回多个值,使用逗号间隔多个数据类型。
table
认识数组
数组,使用一个变量明,存储一系列的值。
在Lua中,我们可以使用table来实现这个功能;在Lua中,table是一系列元素的集合,使用大括号表示,其中元素之间通过逗号间隔。
table类似于C语言中的数组,可以直接使用下标调用table中的元素,但是table的下标从1开始,以此类推。
一般的计算机语言数组基本都是不可变长度的,这里的table为可变长度。
table可是包括任何类型的数据,这一概念就就C语言中的数组概念有区别。table也可以存储函数的变量类型。
table下标
table中每个元素的下标都是自动从1开始的,事实上,下标可以跳过某个顺序。同样可以在声明后进行赋值。
t = {
[1] = 1,
[2] = "abc",
[5] = function() return 0 end,
[8] = 0x12,
}
t[101] = "add"
table的下不局限于是数字,同时可以是字符串,例如:
t = {
["apple"] = 3,
pear = 4, --这里的pear标识"pear"
}
--使用t.apple的方式调用table中的元素
print(t.apple)
--使用t["apple"]的方式调用table中的元素
print(t["apple"])
Lua全局变量和table
table可以直接使用table[下标]或者table.string下标来访问元素。实际上,在Lua中,所有的全局变量全部存储在一个大的table中,名为_G。
table.concat
table.concat类似字符串拼接,把一个label中所有字符或者数字类型的元素拼接成字符串。table.concat(table名, sep),其中seq作为可选参数,表示连接间隔符,默认为空。
循环
while循环
while循环语句的格式为:
while 循环条件 do
--执行的代码
end
for循环
在Lua中for循环与while十分相似,但for循环可以更加简洁的表达中间累加的量。
for循环的格式为:
for 临时变量名=初始值, 结束值, 步长 do
--循环的代码
end
其中步长可以省略,默认为1;临时变量可以直接在代码区使用,但是不能被修改;循环每次会自动加步长值,并且在到达结束值后停止循环。
中断循环
C语言中中断循环使用break、结束当前循环使用continue;Lua中结束本次循环使用break。
我们常见使用死循环,整体逻辑当符合if条件时,调用break跳出当前死循环。
String库
string.sub
查找字符串某个位置之间的字符内容,格式为:
string.sub(s, i [,j])
s表示处理的字符串;
i为要索引的起始下标;
j表示索引的结束下标位置,j可以省略,默认为-1即字符串的末尾。
i和j都可以为负数,负数表示倒数的下标。
string.req
返回字符串s的n次拷贝
string.rep(s, n)
string.len
接收一个字符,返回他的长度
string.len(s)
大小写转换
string.lower(s) --将大写字符全部转换为小写字符
string.upper(s) --将小写字符全部转换为大写字符
string.format
参考formatstring格式化,返回…内容的格式化版本。
string.format(formatstring, ...)
格式化方式与C语言中的printf的规则相同。
print(string.format("%.4f", 3.1415926)) -- 保留4位小数
string的本质
字符串是用来存储一串字符的,但是它的本质就是一串数字,通过使用ASCII码进行保存。
string.char
接收多个整数,返回对对应的ASCII码字符,可以接收0~255个字符。返回值为转换后的字符串。
str1 = string.char(0x30,0x31,0x32,0x33)
string.byte
返回字符串的ASCII值。
string.byte(s [, j [, i]])
参数s为要转换的字符串,j、i可以胜率,j默认为1,i默认为j;i表示转换的下标开始,j表示转接范围结束的下标。
string.find
在字符串中寻找匹配的字符位置。
string.find(s, p[,init [,plain]])
在字符串s中寻找匹配p字符串的数据;如果成功找到,那么会返回p字符串在s字符串中出现的开始位置和结束位置。
第三个参数init默认为1,表示从第一几个字符开始匹配;当init为负数时,从倒数init的位置开始匹配。
第四个参数默认为flase,当为true时,只会把p看作一个字符串对待。(与正则匹配相关)
string.gsub
string.gsub(s, p, r[,n])
将目标字符串s中的p子字符串替换为r,n为可选参数,表示限制替换次数。
返回值有两个一个是被替换后的字符串,第二个是替换多少次。
跨文件调用
在lua中将代码放到不同的文件中,通过文件来区分这些代码的功能。文件格式为.lua。
我们将一个函数放到一个文件中,通过文件调用的方式执行这个函数:
- 创建名为fun.lua的文件,将函数放到文件中
- 在其他文件中引用该文件,则可调用文件内的函数
--fun.lua
local function getnumtable(max)
local t = {}
for i = 1, max do
t[i] = i
end
return t;
end
--main.lua
local tool = require("fun")
local list = tool.getnumtable(12)
调用require接口后,Lua虚拟机会自动加载你调用的文件,执行文件的内容,然后再返回文件里return的结果。