0、安装
0.1 安装
mac:
brew install lua
0.2 测试运行
vi test.lua
print("Hello World!")
lua test.lua
或者指定解释器执行
#!/usr/local/bin/lua
print("Hello World!")
1、变量
1.1 变量类型
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table
a=10
a=2.5
a="abcd"
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
1.2 变量名
字母、数字、下划线(不能以数字开头)
1.3 作用域
局部变量:local标识
function num()
local i = 1
j = 2
print(i)
print(j)
end
num()
print(i)
print(j)
输出结果
1
2
nil
2
1.4 数据类型转化
tostring()
tonumber()
a=100
b=tostring(a)
print(a,' ',b)
print(type(a),' ',type(b))
c='200'
d=tonumber(c)
print(c,' ',d)
print(type(c),' ',type(d))
1.5 删除全局变量
赋值为nil
a=10
a=nil
-- nil 作比较时应该加上双引号
type(X)=="nil"
2、运算符
2.1 算数运算符
+ - * / % ^
2.2 关系运算符
== ~= > < >= <=
2.3 逻辑运算符
and or not
2.4 连接运算符
..
a=1
b=2
c=a..b
print(c)
2.5 一元运算符
获取字符串长度#
print(#'hello world')
3、字符串
3.1 声明
a='hello'
b="hello"
c=[['hello']]
d=[["hello"]]
print(a)
print(b)
print(c)
print(d)
3.2 常用方法
-- 转大写
a='hello'
print(string.upper(a))
-- 转小写
b='HELLO'
print(string.lower(b))
-- 替换
-- 参数 要被替换的字符串,指定替换前的字符,指定替换后的字符,指定替换次数,如果不指定替换次数则全部替换
local c=string.gsub("hello","l","hh",1)
print(c)
-- 查找位置 查找第一个出现在指定字符串中字符的位置,找不到的话就返回nil
-- 参数 目标字符串,目标字符,开始位置
local d=string.find("hello","l",5)
print(d)
-- 反转
local e=string.reverse('hello world')
print(e)
-- 字符串长度
local f=string.len("hello world")
print(f)
-- 字符串拷贝
local g=string.rep("hello",2)
print(g)
-- 字符串截取
local h=string.sub("hello",2,3)
print(h)
-- 字符串格式化
local i=string.format("the value is:%d",i)
print(i)
4、流程控制
4.1 if
-- if
a=200
if (a>1000)
then
print('more than 1000')
else
print('less than 1000')
end
-- if-else
a=200
if (a>1000)
then
print('more than 1000')
elseif (a>1500)
then
print('more than 1500')
else
print('that')
end
4.2 for循坏
-- 从10开始,每次-2,直到值等于4
for a=10,4,-2 do
print(a)
end
-- 从1开始,每次+2,直到值等于10
for a=1,10,2 do
print(a)
end
4.3 while循坏
a=1
while (a<10)
do
a=a+1
print(a)
end
4.4 repeat…until
a=1
repeat
a=a+1
print(a)
until(a>5)
4.5 break
a=1
while(a<10)
do
print(a)
a=a+1
if(a>5)
then
break
end
end
4.6 goto
Label格式::: Label ::
local a = 1
::label:: print("--- goto label ---")
a = a+1
if a < 3 then
goto label -- a 小于 3 的时候跳转到标签 label
end
-- 利用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
5、函数
5.1 定义
function 函数名(参数)
函数内容
return 返回值 --可以没有
end
5.2 无参函数
function hello()
print('hello world')
end
hello()
5.3 有参函数
function hello(a,b)
print(a+b)
end
hello(2,3)
-- 可变参数
function add(...)
local s = 0
for i, v in ipairs{...} do -- {...} 表示一个由所有变长参数构成的数组
s = s + v
end
return s
end
print(add(3,4,5,6,7))
5.4 返回值
-- 单个返回值
function hello(a,b)
return a+b
end
print(hello(2,3))
-- 多个返回值
function hello(a,b)
return a+b,a*b
end
print(hello(2,3))
5.5 匿名函数
function fun(num)
print("num:",num)
num=num+1
return function(x)
print("x:",x)
print("x*num",x*num)
end
end
fun(12)(10)
5.6 闭包函数
闭包就是用内部函数调用外部函数的变量,一般会返回内部函数然后使用外部函数来调用
function fun()
local num=10
function ff()
num=num+1
print(num)
end
return ff
end
fun()()
5.7 递归
function ff(num)
if(num==0 or num==1)
then
return 1
else
return ff(num-1)*num
end
end
print(ff(5))
6、table
【Lua 里表的默认初始索引一般以 1 开始】
6.1 数组
6.1.1 一维数组
可以动态增长
arr={}
arr[1]=123
arr[2]=342
print(arr[1])
6.1.2 多维数组
arr={}
for a=1,4 do
arr[a]={}
for b=1,4 do
arr[a][b]=a+b
end
end
for a=1,3 do
for b=1,3 do
print(a,":",b," ",arr[a][b])
end
end
-- 组合写法
arr={}
local n1,n2=3,4
for i=1,n1 do
for j=1,n2 do
arr[i*n1+n2]=10
end
end
for a=1,n1 do
for b=1,n2 do
print(a,":",b," ",arr[a*n1+n2])
end
end
6.1.3 释放内存空间
arr=nil
6.1.4 迭代器遍历
a={12,56,24,76,237}
for y in pairs(a)
do
print(a[y])
end
-- 带下标
-- 迭代器遍历
b={12,56,24,76,237}
for x,y in pairs(b)
do
print(x,":",y)
end
6.2 链表
6.2.1 声明
类似字典
local a={key=123,value=234}
print(a.value)
6.2.2 遍历链表
-- 迭代器遍历
local a={key=123,value=234}
for x,y in pairs(a)
do
print(x,":",y)
end
6.3 常用方法
6.3.1 concat
将一个table在指定开始和结束位置处以指定分隔符来连接的操作(下标从1开始)
arr1={"erw","dfsf","qwrqw","rqwr"}
arr2=table.concat(arr1,"~",1,3)
print(arr2)
6.3.2 insert
arr1={"erw","dfsf","qwrqw","rqwr"}
table.insert(arr1,3,"hello")
for x,y in pairs(arr1)
do
print(x,":",y)
end
6.3.3 remove
arr1={"erw","dfsf","qwrqw","rqwr"}
table.remove(arr1,3)
for x,y in pairs(arr1)
do
print(x,":",y)
end
6.3.4 sort
arr1={2,37,23,83,54}
table.sort(arr1)
for x,y in pairs(arr1)
do
print(x,":",y)
end
-- 指定排序规则
-- 如从大到小排列
arr1={2,37,23,83,54}
table.sort(arr1,function(a,b) return a>b end)
for x,y in pairs(arr1)
do
print(x,":",y)
end
7、模块和包
7.1 模块调用
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
调用module
require("module")
print(module.constant)
module.func3()
7.2 模块的加载
require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。
可以自定义:文件路径以 ";" 号分隔,最后的 2 个 ";;" 表示新加的路径后面加上原来的默认路径。
export LUA_PATH="~/lua/?.lua;;"
使用C包
与Lua中写包不同,C包在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制。
Lua在一个叫loadlib的函数内提供了所有的动态连接的功能。这个函数有两个参数:库的绝对路径和初始化函数。
local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f() -- 真正打开库
8、文件
8.1 常用方法
mode
r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+ 以可读写方式打开文件,该文件必须存在。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+ 与a类似,但此文件可读可写
b 二进制模式,如果文件是二进制文件,可以加上b
+ 表示对文件既可以读也可以写
func
io.write()
io.flush()
io.close()
io.open(filename,mode)
8.1.1 创建文件夹
os.execute('mkdir luadirtest')
f = assert(io.open('luanewfile.txt','w'))
f:close()
8.2 输出文件
输出一行
local file=io.open('luanewfile.txt','r')
io.input(file)
print(io.read())
io.close()
逐行输出(最后无空行)
for i in io.lines('luanewfile.txt') do
print(i)
end
--使用文件句柄
local file=io.open('luanewfile.txt','r')
for i in file:lines() do
print(i)
end
file:close()
输出整个文件(最后有空行)
local file=io.open('luanewfile.txt','r')
io.input(file)
print(io.read('*a'))
io.close()
--使用文件句柄
local file=io.open('luanewfile.txt','r')
print(file:read('*a'))
file:close()
--'*a' 读取整个文件
--'*l' 读取下一行(不包括换行符)=io.read()
--'*L' 读取下一行(包括换行符)
--'*n' 读取一个数字(非数字开头返回nil,数字开头直到读到非数字)
--num 读取num个字符
8.3 写入文件
local file=io.open('luanewfile.txt','w')
io.output(file)
io.write('hello world')
io.close()
--文件句柄
local file=io.open('luanewfile.txt','w')
file:write("hey go")
file:close()
8.4 文件指针
“set”: 基点为 0 (文件开头)
“cur”: 基点为当前位置,默认
“end”: 基点为文件尾
-- 从文件开头算起,跳过3个字符,然后输出2个字符
local file=io.open('luanewfile.txt','r')
file:seek('set',3)
print(file:read(2))
file:close()
-- 从文件结尾算起,往前推5个字符,然后输出2个字符
参考链接:
https://www.runoob.com/lua/lua-tutorial.html
https://www.sohu.com/a/468031584_120372431
https://www.sohu.com/a/464455971_120372431
https://www.sohu.com/a/466566945_120372431
如有不对,烦请指出,感谢~