[编程]LUA基础
Posted 共享吧sharebar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[编程]LUA基础相关的知识,希望对你有一定的参考价值。
1.LUA入门
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
1.1 LUA语法
单行注释:--
多行行注释:--[[]]
声明变量:以大小写a_z或下划线_开头,最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。Lua语言区分大小的,变量a和A是两个不同变量,函数 functionabc()和函数function Abc()是两个不同函数。使用未定义的变量时,变量值为nil.
function test()
print(a) --nil
end
Lua的语句结束符“;”可加可不加。
Lua语言关键字
判断关键字:if、else、elseif、true、false、then
逻辑关键字:and、or、not
循环:in 、break、 util、repeat、while、for、do
其他:function、return、nil、local、end
1.2 LUA数据类型
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
函数type获取变量的类型
function Addsum(istart, iend)
returnistart + iend
end
print(type(a))
print(type(Addsum))
print(type('abc'))
print(type(12))
运行结果:
nil
function
string
Number
string(字符串)声明
用一对单引号、双引号、方括号声明。
a = 'string'
b = "string"
c = [[string]]
print(a)
print(b)
print(c)
运行结果:
string
string
String
table(表)用法
在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:
--创建一个空的 tablelocal tbl1 ={}
--直接初始表local tbl2 ={"apple","pear","orange","grape"}
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
-- table_test.lua 脚本文件
a ={}
a["key"]="value"
key =10
a[key]=22
a[key]= a[key]+11
for k, v in pairs(a)do
print(k .." : ".. v)
end
脚本执行结果为:
key : value
10:33
不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
-- table_test2.lua 脚本文件
local tbl ={"apple","pear","orange","grape"}
for key, val in pairs(tbl)do
print("Key", key)
end
脚本执行结果为:
Key 1
Key 2
Key 3
Key 4
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
-- table_test3.lua 脚本文件
a3 ={}
for i =1,10do
a3[i]= i
end
a3["key"]="val"
print(a3["key"])
print(a3["none"])
脚本执行结果为:
$ lua table_test3.lua
valnil
function(函数)用法
Lua中的函数可以跟变量一样使用。
function addsum(istart, iend)
sum = 0
for i =istart, iend do
sum =sum + i
end
return sum
end
function Addsum(istart, iend)
returnistart + iend
end
function print_r()
print("hellolua")
end
Addsum = addsum
print(Addsum(1,100))
Addsum=print_r
Addsum()
运行结果:
5050
hello lua
1.3 LUA运算符
算术运算符
加+、减-、乘*、除法/、取余%、幂^、负号-。
关系运算符
等于==、不等于~=、小于<、大于>、大于等于>=、小于等于<=。
关系运算符不仅可以用于数值比较,还可以用于字符串的比较。
a = 'string'
b = 'string'
if a == b then
print("true")
else
print("false")
end
if a < b then
print("true")
else
print("false")
end
运行结果:
true
false
逻辑运算符
逻辑与and、逻辑或or、逻辑非not。
当逻辑非not false、not nil 为真。
其他运算符
字符串连接..、字符串长度#。
a = 'hello '
b = 'lua'
c = a..b
print(c)
print(#c)
运行结果:
hello lua
9
1.4 LUA流程控制
1.判断语句
一个判断
if...then...end
a = 1
b = 1.0
if a == b then
print("ok")
End
运行结果:
ok
两个判断
if...then...else...end
a = 1
b = 1.0
if a < b then
print("ok")
else
print("notok")
End
运行结果:
not ok
多个判断:
if...then..elseif..then..else..end
a = 1
b = 1.0
if a < b then
print("a< b")
elseif a > b then
print("a> b")
elseif a == b then
print("a== b")
else
print("a~= b")
end
运行结果:
a == b
2.循环
while循环
while(条件)do
循环体
end
a=10
while( a <20)do
print("a 的值为:", a)
a = a+1
end
for循环
数值型for循环
forvar=循环开始值,循环结束值,递增值do
<执行体>
end
默认递增值为1
for i = 1, 10, 1 do --循环10次,可以简写成for i = 1, 10 do
print(i)
end
相当于C语言中
for(int i=1; i<=10;i++)
for i = 1, 10, 2 do --循环5次
print(i)
end
相当于C语言中
for(int i=1; i<=10;i+=2)
泛型for循环
通常用来循环一个table.
for i,v in ipairs(a)do
print(v)
end
i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
local fruit ={"apple","banana","lichi"}
for k, v in pairs(fruit) do
print(k,v)
end
运行结果:
1 apple
2 banana
3 lichi
repeat循环
repeat
循环体
until(条件)
我们注意到循环条件判断语句(condition)在循环体末尾部分,所以在条件进行判断前循环体都会执行一次。
如果条件判断语句(condition)为 false,循环会重新开始执行,直到条件判断语句(condition)为 true 才会停止执行。
--[变量定义--]
a =10--[执行循环--]
repeat
print("a的值为:", a)
a = a +1
until( a >15)
1.5 LUA函数
函数定义
function 函数名(参数1,参数2)
函数体
return 返回值
end
LUA函数特点1:当传入的实参数少于形参时,未初始化的形参为nil值。
function add(a, b, c)
print(a,',',b,',',c)
end
add(1,2)
运行结果:
1 , 2 , nil
LUA函数特点2:形参不能有默认值。
function add(a, b, c=1) --语法错误
print(a,',',b,',',c)
end
LUA函数特点3:可以有多个返回值。
function addsub(a, b)
return a +b, a - b
end
a, b = addsub(1, 2)
print(a,",",b)
运行结果:
3 , -1
1.6 LUA 字符串
Lua 语言中字符串可以使用以下三种方式来表示:
单引号间的一串字符。
双引号间的一串字符。
[[和]]间的一串字符。
LUA中转义字符
\t 水平制表 (跳到下一个TAB位置)
\\ 代表一个反斜线字符''\'
\' 代表一个单引号(撇号)字符
\" 代表一个双引号字符
\f 将当前位置移到下页开头
\n 换行(LF),将当前位置移到下一行开头
声明长字符串的方法。
1.用”\”连接
2.用[[]]声明
字符串函数
1 |
string.upper(argument): |
2 |
string.lower(argument): |
3 |
string.gsub(mainString,findString,replaceString,num) >string.gsub("aaaa","a","z",3); zzza 3 |
4 |
string.find (str, substr, [init, [end]]) >string.find("Hello Lua user","Lua",1)7 9 |
5 |
string.reverse(arg) >string.reverse("Lua") auL |
6 |
string.format(...) >string.format("the value is:%d",4) the value is:4 |
7 |
string.char(arg) 和 string.byte(arg[,int]) >string.char(97,98,99,100) abcd>string.byte("ABCD",4)68>string.byte("ABCD")65> |
8 |
string.len(arg) string.len("abc")3 |
9 |
string.rep(string, n) >string.rep("abcd",2) abcdabcd |
字符串函数两种调用方法:
1.使用系统封装标准的函数
2.字符串:函数名()
a = "abc"
print(string.len(a))
print(a:len())
运行结果:
3
3
1.7 LUA 数组
数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。
在Lua 索引值是以 1 为起始。
array ={"Lua","Tutorial"}
for i=0,2do
print(array[i])
end
运行结果:
nil
Lua
Tutorial
1.8 LUA table
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
table(表)的构造
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:
--初始化表
mytable ={}
--指定值
mytable[1]="Lua"
--移除引用
mytable =nil-- lua 垃圾回收会释放内存
当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
Table 操作
以下列出了 Table 操作常用的方法:
序号 |
方法 & 用途 |
1 |
table.concat (table [, sep [, start [, end]]]): concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。 |
2 |
table.insert (table, [pos,] value): 在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾. |
3 |
table.maxn (table) 指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现) |
4 |
table.remove (table [, pos]) 返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。 |
5 |
table.sort (table [, comp]) 对给定的table进行升序排序。 |
1.9 LUA文件操作
file = io.open (filename [, mode])
mode 的值有:
模式 |
描述 |
r |
以只读方式打开文件,该文件必须存在。 |
w |
打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 |
a |
以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) |
r+ |
以可读写方式打开文件,该文件必须存在。 |
w+ |
打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a+ |
与a类似,但此文件可读可写 |
b |
二进制模式,如果文件是二进制文件,可以加上b |
+ |
号表示对文件既可以读也可以写 |
--读文件
file= io.open("D:/message.txt", "r")
io.input(file)
message=io.read("*all")
print(message)
io.close(file)
--写文件
file= io.open("D:/message.txt", "a+")
io.output(file)
io.write("\nadda new line")
io.close(file)
1.10 LUA引入其他文件
1.require引入
文件1:111.lua
function sayhello()
print("hellolua")
end
文件2:222.lua
LUA_ROOT ="C:/Users/zhoushaozhou/Desktop/lua"
package.path = LUA_ROOT .. "/?.lua;" ..package.path
require("111")
sayhello()
2.dofile引入
文件2:222.lua
dofile("C:/Users/zhoushaozhou/Desktop/lua/111.lua")
sayhello()
2.LUA开发工具
语法测试工具:
工程开发工具:
vscode支持LUA5.3版本,LuaEditor仅支持5.1版本,5.3版本最新的函数在LuaEditor编译不了。
LuaEditor自带有Lua入门文档。
Windows10环境下打开的文档可能显示不了,需要进行设置一下,找到LuaEditor的安装目录,找到LuaDesign.chm文件,右键属性,解除锁定哪里打上勾即可。
vscode调试脚本
1.点击调试按钮,进入调试界面
2.设置需要调试的脚本
3.开始调试
3.LUA开发注意事项
dofile和require的区别
见http://www.jb51.net/article/55125.htm
简言之,require只载入一次, reuire中引入的文件如有修改,需要重启服务才能生效。
dofile引入的文件如有修改,下次运行时立即生效。
示例acc_acccout.lua
-- 全局变量初始化
require "pub.init"
-- 全局引用
require "pub.xcall" -- 基础库
require "pub.utils" -- 算法库
-- [会计模块]全局变量
require "acc.acc_golbal"
假如pub目录下utils脚本有修改,则必须重启acc_account_64服务后,修改才生效。
if string.sub(in_t.ANAME, 1, 1) == "X" then
-- 会计服务
dofile(LUA_ROOT .. "/acc/acc_manage.lua")
ret_t = acc_manage(in_t)
elseif string.sub(in_t.ANAME, 1, 1) == "T" then
-- 账务服务
dofile(LUA_ROOT .. "/acc/acc_charge.lua")
ret_t = acc_charge(in_t)
end
如acc目录下acc_charge.lua脚本有改动,则程序再入加载acc_charge.lua文件时即生效。
Lua初始化多个参数
Lua初始化多个变量时跟C++区别有区别
C++初始化多个变量 int a=1,b= 2
Lua初始化多个变量 local a,b = 1, 2
如local a, b = 1,表示初始化a=1,b=nil(空值)
LUA的return语句必须是块中最后一句
正确:
local function add(a, b)
local sum
sum = a + b
return sum
end
错误:
local function add(a, b)
local sum
sum = a + b
return sum
--其他业务处理
local c
end
LUA中没有自增运算符
LUA不像C、JAVA语言中有自增运算符++,LUA要自增只能通过+1实现
a = a + 1
• END •
以上是关于[编程]LUA基础的主要内容,如果未能解决你的问题,请参考以下文章