mac:
brew install lua
vi test.lua
print("Hello World!")
lua test.lua

或者指定解释器执行
#!/usr/local/bin/lua
print("Hello World!")

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table
a=10
a=2.5
a="abcd"
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
字母、数字、下划线(不能以数字开头)
局部变量:local标识
function num()
local i = 1
j = 2
print(i)
print(j)
end
num()
print(i)
print(j)
输出结果
1
2
nil
2
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))

赋值为nil
a=10
a=nil
-- nil 作比较时应该加上双引号
type(X)=="nil"

+ - * / % ^
== ~= > < >= <=
and or not
..
a=1
b=2
c=a..b
print(c)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIMg2Y1R-1659858151210)(lua.assets/image-20220729165632123.png)]](https://1000bd.com/contentImg/2022/08/12/031128545.png)
获取字符串长度#
print(#'hello world')
a='hello'
b="hello"
c=[['hello']]
d=[["hello"]]
print(a)
print(b)
print(c)
print(d)

-- 转大写
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)

-- 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

-- 从10开始,每次-2,直到值等于4
for a=10,4,-2 do
print(a)
end
-- 从1开始,每次+2,直到值等于10
for a=1,10,2 do
print(a)
end


a=1
while (a<10)
do
a=a+1
print(a)
end

a=1
repeat
a=a+1
print(a)
until(a>5)

a=1
while(a<10)
do
print(a)
a=a+1
if(a>5)
then
break
end
end

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

function 函数名(参数)
函数内容
return 返回值 --可以没有
end
function hello()
print('hello world')
end
hello()

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

-- 单个返回值
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))



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)

闭包就是用内部函数调用外部函数的变量,一般会返回内部函数然后使用外部函数来调用
function fun()
local num=10
function ff()
num=num+1
print(num)
end
return ff
end
fun()()

function ff(num)
if(num==0 or num==1)
then
return 1
else
return ff(num-1)*num
end
end
print(ff(5))

【Lua 里表的默认初始索引一般以 1 开始】
可以动态增长
arr={}
arr[1]=123
arr[2]=342
print(arr[1])
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




arr=nil
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
类似字典
local a={key=123,value=234}
print(a.value)

-- 迭代器遍历
local a={key=123,value=234}
for x,y in pairs(a)
do
print(x,":",y)
end

将一个table在指定开始和结束位置处以指定分隔符来连接的操作(下标从1开始)
arr1={"erw","dfsf","qwrqw","rqwr"}
arr2=table.concat(arr1,"~",1,3)
print(arr2)

arr1={"erw","dfsf","qwrqw","rqwr"}
table.insert(arr1,3,"hello")
for x,y in pairs(arr1)
do
print(x,":",y)
end

arr1={"erw","dfsf","qwrqw","rqwr"}
table.remove(arr1,3)
for x,y in pairs(arr1)
do
print(x,":",y)
end

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


-- 文件名为 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()

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() -- 真正打开库
r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+ 以可读写方式打开文件,该文件必须存在。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+ 与a类似,但此文件可读可写
b 二进制模式,如果文件是二进制文件,可以加上b
+ 表示对文件既可以读也可以写
io.write()
io.flush()
io.close()
io.open(filename,mode)
os.execute('mkdir luadirtest')
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neoJN2kT-1659858444413)(lua.assets/image-20220727095641101.png)]](https://1000bd.com/contentImg/2022/08/12/031136185.png)
f = assert(io.open('luanewfile.txt','w'))
f:close()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXUJS7eX-1659858444414)(lua.assets/image-20220727100221871.png)]](https://1000bd.com/contentImg/2022/08/12/031136185.png)
输出一行
local file=io.open('luanewfile.txt','r')
io.input(file)
print(io.read())
io.close()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcGXUoSb-1659858444415)(lua.assets/image-20220729141228480.png)]](https://1000bd.com/contentImg/2022/08/12/031136569.png)
逐行输出(最后无空行)
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个字符


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


“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
如有不对,烦请指出,感谢~