Lua学习
简介
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
安装
由于macOS中没有自带Lua,所以我们需要自己进行安装
macOS:
将下载好的tar.gz文件 直接双击解压,再进入Terminal
sudo make macosx test
sudo make install
输入password即可
验证安装
lua -v
数据类型
八个基本类型,分别为
nil -> 表示无效值,在条件表达式中相当于false
boolean
number -> 表示双精度类型的实浮点数
string
function -> C或者Lua编写的函数
table -> 是一个关联数组,类似于Map,通过“构造表达式”完成,最简单的是 { }
userdata -> 表示任意存储在变量中 的 C数据结构
thread -> 类似于线程
Nil ( 空 )
-
对于全局变量和table : nil有一个删除的作用
-
nil作比较时应该加上双引号
> type(X) nil > type(X)==nil --- > 这里type(X)的type相当于一个名称,即为string,所以比较会失败 false > type(X)=="nil" true
table ( 表 )
初始化
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
-- 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 ==开始。
tbl = {"小王", "小李", "小徐", "小军"}
for key, val in pairs(tbl) do
print("Key", key,"\t","Value",val)
end
运行结果为:
Key 1 Value 小王
Key 2 Value 小李
Key 3 Value 小徐
Key 4 Value 小军
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
变量
-
Lua 变量有三种类型:全局变量、局部变量、表中的域。
-
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
-
局部变量的作用域为从声明位置开始到所在语句块结束。
-
变量的默认值均为 nil。
-
Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:
a, b = 0, 1 a, b = a+1, a+1 print(a,b) --> 1 1 a, b = 0, 1 a, b = b+1, b+1 print(a,b) --> 2 2 a, b = 0, 1 a = a+1 b = a+1 print(a,b) --> 1 2
循环
while 循环
while(true)
do
XXXX
end
For 循环
普通for循环
for i=val1,val2,val3 do
XXXXX
end
-- i 从val1变化到val2,每次以val3的步长递增,如果不指定val3,则默认步长为1
范形for循环
泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。
Lua 编程语言中泛型 for 循环语法格式:
--打印数组a的所有值
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
--打印一周七天
days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do
print(v)
end
Repeat - until 循环
repeat
statements
until( condition )
-- 类似于do-while
循环控制语句
break
goto
语法格式如下所示:
goto Label
Label 的格式为:
:: Label ::
有了 goto,我们可以实现 continue 的功能:
for i=1, 3 do
if i <= 2 then
print(i, "yes continue")
goto continue
end
print(i, " no continue")
::continue::
print([[i'm end]])
end
-- 输出结果为:
1 yes continue
i'm end
2 yes continue
i'm end
3 no continue
i'm end
流程控制
if(布尔表达式)
then
--[ 布尔表达式为 true 时执行该语句块 --]
else
--[ 布尔表达式为 false 时执行该语句块 --]
end
文件IO
Lua I/O 库用于读取和处理文件。分为简单模式(和C一样)、完全模式。
- 简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
- 完全模式(complete model) 使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法
打开文件操作语句如下:
file = io.open (filename , mode)
mode 的值有:
模 式 | 描述 |
---|---|
r | 以只读方式打开文件,该文件必须存在。 |
w | 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) |
r+ | 以可读写方式打开文件,该文件必须存在。 |
w+ | 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a+ | 与a类似,但此文件可读可写 |
b | 二进制模式,如果文件是二进制文件,可以加上b |
+ | 号表示对文件既可以读也可以写 |
--- 要提前建立好test文件
-- 以只读方式打开文件
file = io.open("test", "r")
-- 设置默认输入文件为 test
io.input(file)
-- 输出文件第一行
print(io.read())
-- 关闭打开的文件
io.close(file)
-- 以附加的方式打开只写文件
file = io.open("test", "a")
-- 设置默认输出文件为 test.lua
io.output(file)
-- 在文件最后一行添加 Lua 注释
io.write("-- test 文件末尾注释")
-- 关闭打开的文件
io.close(file)
----只输出了test文件里的第一行数据:
say hey hey hey Lua NZ-1906 XSQ
----但是test文件中添加了内容 变成了
say hey hey hey Lua NZ-1906 XSQ-- test 文件末尾注释
Lua 数据库的访问
Lua 数据库的操作库:LuaSQL。他是开源的,支持的数据库有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。
LuaSQL 可以使用 LuaRocks 来安装可以根据需要安装需要的数据库驱动。
LuaRocks 安装方法: — macOS/Linux
cd luarocks
./configure; sudo make bootstrap
sudo luarocks install luasocket
注意事项:
cd /usr/local/share/lua/5.3/luarocks
sudo luarocks install luasql-mysql MYSQL_DIR=/usr/local/mysql
# 这样才成功安装上了 lua-mysql的驱动,不会报错not found 了
Example:
luasql = require "luasql.mysql"
--创建环境对象
env = luasql.mysql()
--连接数据库
conn = env:connect("mydb","root","1234","10.211.55.102",3306)
--设置数据库的编码格式
conn:execute"SET NAMES UTF8"
--执行数据库操作
cur = conn:execute("select * from dept")
row = cur:fetch({},"a")
--文件对象的创建
file = io.open("dept.txt","w+");
while row do
var = string.format("%s %s %s\n", row.deptno, row.dname,row.loc)
print(var)
file:write(var)
row = cur:fetch(row,"a")
end
file:close() --关闭文件对象
conn:close() --关闭数据库连接
env:close() --关闭数据库环境
-----输出结果为
/usr/local/bin/lua Demo01_test.lua
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
----以及一个文件名为dept.txt的文件