【编程】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

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

print("ok")

else

print("notok")

End

运行结果:

not ok

多个判断:

if...then..elseif..then..else..end

a = 1

b = 1.0

if a

print("a

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

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

for i = 1, 10, 2 do --循环5次

print(i)

end

相当于C语言中

for(int i=1; i

泛型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.使用系统封装标准的函数

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.9 LUA文件操作

file = io.open (filename [, mode])

mode 的值有:

--读文件

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 •

欢迎将文章分享到朋友圈

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180723G06B5Z00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券