【从零开始 】Lua的学习

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 ( 空 )

  1. 对于全局变量和table : nil有一个删除的作用

  2. 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。

变量

  1. Lua 变量有三种类型:全局变量、局部变量、表中的域。

  2. Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

  3. 局部变量的作用域为从声明位置开始到所在语句块结束。

  4. 变量的默认值均为 nil。

  5. 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的文件 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值