[编程]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)
 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:

>string.gsub("aaaa","a","z",3);
zzza         3
 

 

4

string.find (str, substr, [init, [end]])
 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。

>string.find("Hello Lua user","Lua",1)7               9
 

5

string.reverse(arg)
 字符串反转

>string.reverse("Lua")
auL
 

6

string.format(...)
 返回一个类似printf的格式化字符串

>string.format("the value is:%d",4)
the value is:4
 

7

string.char(arg) 和 string.byte(arg[,int])
 char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

>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的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基础的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(104):Splash基础(支持Lua的轻量级浏览器)

[专栏日更]223 | Lua编程5之函数

第六章第一节Lua编程基础

Lua脚本语言——基础语法

Lua从青铜到王者基础篇第二篇:Lua基本语法和数据类型

lua是啥语言